Python __neg__ 方法
最后修改于 2025 年 4 月 8 日
本综合指南探讨了 Python 的 __neg__
方法,这是一种实现一元求反运算符 (-) 的特殊方法。我们将涵盖基本用法、数学运算、自定义类和实际示例。
基本定义
__neg__
方法是 Python 中的一种特殊方法,用于实现一元求反运算符 (-)。当您在对象上使用 - 运算符时,Python 会调用此方法来确定结果。
主要特征:它只接受 self
作为参数,返回求反后的值,并且应该返回一个新对象,而不是修改原始对象。它为自定义类启用运算符重载。
基本 __neg__ 实现
这是一个简单的实现,展示了 __neg__
如何与自定义数字类一起工作。 它演示了基本语法和行为。
class Number: def __init__(self, value): self.value = value def __neg__(self): return Number(-self.value) def __repr__(self): return f"Number({self.value})" num = Number(5) neg_num = -num print(neg_num) # Output: Number(-5)
此示例表明,将 - 运算符应用于 Number 实例会调用 __neg__
,它返回一个具有求反值的新 Number。 原始对象保持不变。
包含 __repr__
方法是为了更好地表示字符串,但对于 __neg__
功能不是必需的。
数学向量求反
__neg__
方法对于数学类特别有用,因为在这些类中,求反具有特定含义,例如向量。
class Vector: def __init__(self, x, y): self.x = x self.y = y def __neg__(self): return Vector(-self.x, -self.y) def __repr__(self): return f"Vector({self.x}, {self.y})" v = Vector(3, -4) neg_v = -v print(neg_v) # Output: Vector(-3, 4)
在此向量示例中,求反返回一个新向量,其中两个分量都被求反。 这遵循标准的数学向量求反规则。
该方法保留原始向量,同时创建一个具有求反值的新向量,这是不可变对象的预期行为。
带求反的温度类
这是一个使用 __neg__
的实际示例,用于处理摄氏和华氏刻度的温度类。
class Temperature: def __init__(self, value, scale='C'): self.value = value self.scale = scale def __neg__(self): return Temperature(-self.value, self.scale) def convert(self): if self.scale == 'C': return Temperature(self.value * 9/5 + 32, 'F') else: return Temperature((self.value - 32) * 5/9, 'C') def __repr__(self): return f"{self.value}°{self.scale}" temp = Temperature(25) print(-temp) # Output: -25°C print((-temp).convert()) # Output: -13.0°F
此温度类演示了 __neg__
仅对值求反,同时保留刻度。 转换方法显示了求反如何与其他操作交互。
请注意,求反不会自动在刻度之间转换 - 它只是对当前刻度中的数值求反。
带求反的自定义货币类
此示例显示了一个 Money 类,其中求反表示债务或负余额,这是一个常见的财务概念。
class Money: def __init__(self, amount, currency='USD'): self.amount = amount self.currency = currency def __neg__(self): return Money(-self.amount, self.currency) def __add__(self, other): if self.currency != other.currency: raise ValueError("Currencies must match") return Money(self.amount + other.amount, self.currency) def __repr__(self): return f"{self.amount:.2f} {self.currency}" balance = Money(100.50) debt = -balance print(debt) # Output: -100.50 USD print(balance + debt) # Output: 0.00 USD
在这种财务上下文中,求反表示债务或负余额。 该示例还显示了求反如何与加法交互以清零余额。
__add__
中的货币检查表明 __neg__
保留所有属性(如货币),同时仅对金额求反。
矩阵求反
对于更复杂的数学对象(如矩阵),__neg__
可以实现逐元素求反,遵循线性代数规则。
class Matrix: def __init__(self, data): self.data = data def __neg__(self): neg_data = [[-elem for elem in row] for row in self.data] return Matrix(neg_data) def __repr__(self): return '\n'.join(' '.join(f"{elem:3}" for elem in row) for row in self.data) m = Matrix([[1, 2], [3, 4]]) print("Original:") print(m) print("\nNegated:") print(-m)
此矩阵实现显示了 __neg__
如何通过将求反运算应用于每个元素来处理嵌套数据结构。
列表推导创建一个新矩阵,其中所有元素都被求反,遵循数学矩阵求反规则,同时保留结构。
最佳实践
- 返回新对象: 求反不应修改原始对象
- 保留其他属性: 仅对数学上适当的内容求反
- 保持不变性: 原始对象应保持不变
- 类型一致性: 返回与原始对象相同的类型
- 文档行为: 清楚地解释求反对您的类的意义
资料来源
作者
列出所有 Python 教程。