ZetCode

Python __itruediv__ 方法

最后修改于 2025 年 4 月 8 日

这份全面的指南探讨了 Python 的 __itruediv__ 方法,它是用于原地真除法的特殊方法。我们将涵盖基本用法、运算符重载、实际示例和最佳实践。

基本定义

__itruediv__ 方法实现了原地真除法运算 (/=)。它原地修改左操作数,而不是创建一个新对象。

主要特征:它必须返回修改后的对象(通常是 self),处理 /= 运算符,并且即使使用整数也执行浮点除法。当不存在 __truediv__ 时,它会被调用。

基本 __itruediv__ 实现

这是一个简单的实现,展示了 __itruediv__ 如何与自定义类一起工作。该方法修改实例的值。

basic_itruediv.py
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__,该类分别维护分子和分母。

fraction_itruediv.py
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__ 方法更新分数的组成部分并简化结果。

该方法检查右操作数的类型,以正确处理不同的除法情况。它在每次操作后将分数保持在其最简形式。

向量原地除法

此示例显示了向量除法,其中每个分量都使用 /= 运算符除以标量值。

vector_itruediv.py
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 对象。即使除以整数,分量也会变成浮点数。

矩阵原地除法

这个更高级的示例演示了矩阵除法,其中每个元素都除以标量或另一个矩阵元素。

matrix_itruediv.py
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 类,该类支持考虑单位转换的原地除法。

temperature_itruediv.py
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 属性提供转换后的值,但在除法运算中未使用。所有计算都在开尔文刻度上进行,以保持一致性。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程