Python __itruediv__ 方法
最后修改于 2025 年 4 月 8 日
这份全面的指南探讨了 Python 的 __itruediv__
方法,它是用于原地真除法的特殊方法。我们将涵盖基本用法、运算符重载、实际示例和最佳实践。
基本定义
__itruediv__
方法实现了原地真除法运算 (/=
)。它原地修改左操作数,而不是创建一个新对象。
主要特征:它必须返回修改后的对象(通常是 self
),处理 /=
运算符,并且即使使用整数也执行浮点除法。当不存在 __truediv__
时,它会被调用。
基本 __itruediv__ 实现
这是一个简单的实现,展示了 __itruediv__
如何与自定义类一起工作。该方法修改实例的值。
class Number: def __init__(self, value): self.value = value def __itruediv__(self, other): self.value /= other return self num = Number(10) num /= 2 print(num.value) # Output: 5.0
此示例显示了基本结构。__itruediv__
方法将实例的值除以右操作数,并返回修改后的实例。
请注意,即使使用整数输入,真除法总是产生浮点结果。该方法原地修改对象,而不是创建一个新对象。
带有原地除法的 Fraction 类
此示例演示了在更复杂的 Fraction 类中使用 __itruediv__
,该类分别维护分子和分母。
class Fraction: def __init__(self, numerator, denominator=1): self.numerator = numerator self.denominator = denominator def __itruediv__(self, other): if isinstance(other, Fraction): self.numerator *= other.denominator self.denominator *= other.numerator else: self.denominator *= other self._simplify() return self def _simplify(self): gcd_val = gcd(self.numerator, self.denominator) self.numerator //= gcd_val self.denominator //= gcd_val def __repr__(self): return f"Fraction({self.numerator}, {self.denominator})" from math import gcd f1 = Fraction(3, 4) f1 /= Fraction(1, 2) print(f1) # Fraction(6, 4) simplified to Fraction(3, 2)
这个 Fraction 类处理与分数和数字的原地除法。__itruediv__
方法更新分数的组成部分并简化结果。
该方法检查右操作数的类型,以正确处理不同的除法情况。它在每次操作后将分数保持在其最简形式。
向量原地除法
此示例显示了向量除法,其中每个分量都使用 /=
运算符除以标量值。
class Vector: def __init__(self, *components): self.components = list(components) def __itruediv__(self, scalar): if scalar == 0: raise ValueError("Cannot divide by zero") self.components = [x / scalar for x in self.components] return self def __repr__(self): return f"Vector({', '.join(map(str, self.components))})" v = Vector(2, 4, 6) v /= 2 print(v) # Vector(1.0, 2.0, 3.0)
此处的 __itruediv__
方法将每个向量分量除以标量值。它包括防止除以零的保护措施。
此实现原地修改向量,而不是创建一个新的 Vector 对象。即使除以整数,分量也会变成浮点数。
矩阵原地除法
这个更高级的示例演示了矩阵除法,其中每个元素都除以标量或另一个矩阵元素。
class Matrix: def __init__(self, rows): self.rows = rows def __itruediv__(self, other): if isinstance(other, (int, float)): for i in range(len(self.rows)): for j in range(len(self.rows[i])): self.rows[i][j] /= other elif isinstance(other, Matrix): for i in range(len(self.rows)): for j in range(len(self.rows[i])): self.rows[i][j] /= other.rows[i][j] return self def __repr__(self): return '\n'.join([' '.join(map(str, row)) for row in self.rows]) m = Matrix([[1, 2], [3, 4]]) m /= 2 print(m) # Output: # 0.5 1.0 # 1.5 2.0
这个 Matrix 类处理两种类型的除法:除以标量(除所有元素)和除以另一个矩阵(按元素除法)。
__itruediv__
方法检查右操作数的类型,以确定要执行的除法运算。它原地修改矩阵。
带有单位转换的温度类
此示例显示了一个 Temperature 类,该类支持考虑单位转换的原地除法。
class Temperature: def __init__(self, kelvin): self.kelvin = kelvin def __itruediv__(self, other): if isinstance(other, Temperature): self.kelvin /= other.kelvin else: self.kelvin /= other return self @property def celsius(self): return self.kelvin - 273.15 def __repr__(self): return f"Temperature(K={self.kelvin}, C={self.celsius})" t = Temperature(300) t /= 2 print(t) # Temperature(K=150.0, C=-123.15)
Temperature 类在内部以开尔文存储值,但可以除以数字或其他 Temperature 对象。__itruediv__
方法修改内部开尔文值。
celsius 属性提供转换后的值,但在除法运算中未使用。所有计算都在开尔文刻度上进行,以保持一致性。
最佳实践
- 返回 self:始终返回修改后的对象以进行链式操作
- 类型检查:验证操作数类型以进行鲁棒操作
- 错误处理:处理除以零和类型不匹配
- 文档行为:清楚地记录预期的操作数类型
- 一致性:与 __truediv__ 保持一致的行为
资料来源
作者
列出所有 Python 教程。