说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python中特殊的反向运算符方法(right-side operator methods),它们用于处理当对象出现在表达式的右侧时的操作。这些方法允许在对象与另一个对象之间进行运算时,反向地调用操作。
例如,对于二元操作符 +,当左侧对象的 __add__()
方法不支持与右侧对象的类型的运算时,Python 解释器将尝试调用右侧对象的 __radd__()
方法,以支持这种操作。
class Data_1:
pass
class Data_2:
def __radd__(self, other):
return 'called reverse +'
x = Data_1()
y = Data_2()
print(x + y)
# called reverse +
下面是这些特殊方法的简要说明:
object.__radd__(self, other)
: 右加法运算(反向加法)object.__rsub__(self, other)
: 右减法运算(反向减法)object.__rmul__(self, other)
: 右乘法运算(反向乘法)object.__rmatmul__(self, other)
: 右矩阵乘法运算(反向矩阵乘法)object.__rtruediv__(self, other)
: 右真除法运算(反向真除法)object.__rfloordiv__(self, other)
: 右整除法运算(反向整除法)object.__rmod__(self, other)
: 右取模运算(反向取模)object.__rdivmod__(self, other)
: 右取模运算(反向取模)object.__rpow__(self, other[, modulo])
: 右幂运算(反向幂运算)object.__rlshift__(self, other)
: 右移位运算(反向左移位)object.__rrshift__(self, other)
: 右移位运算(反向右移位)object.__rand__(self, other)
: 右按位与运算(反向按位与)object.__rxor__(self, other)
: 右按位异或运算(反向按位异或)object.__ror__(self, other)
: 右按位或运算(反向按位或)这些方法可以在自定义类中实现,以支持特定对象类型的运算,以增强代码的灵活性和可扩展性。
调用这些方法来实现具有反射(交换)操作数的双目算术运算 ( +, - ``, ``*, @, /, //, %, divmod(), pow(), **, <<, >>, &, ^, |
)。 这些函数仅会在左操作数不支持相应运算 且两个操作数类型不同时被调用。 例 如,求表达式 x - y 的值,其中 y 是具有 __rsub__()
方法的类的一个实例,则当 type(x).__sub__(x, y)
返回 NotImplemented 时将会调用 type(y).__rsub__(y, x)
。
请注意三元版的 pow() 并不会尝试调用 __rpow__()
(因为强制转换规则会太过复杂)。
备注 如果右操作数类型为左操作数类型的一个子类,且该子类提供了指定运算的反射方法,则此方法将先于左操作数的非反射方法被调用。 此行为可允许子类重载其祖先类的运算符。
当我们定义一个自定义类时,我们可以实现这些反向运算符方法来支持与其他类型对象的运算。让我们以一个简单的向量类为例,实现加法操作。假设我们有一个名为 Vector 的类,表示二维向量:
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __radd__(self, other):
# 反向加法
return Vector(self.x + other, self.y)
现在,如果我们有两个向量实例 v1 和 v2,以及一个整数 scalar:
v1 = Vector(1, 2)
v2 = Vector(3, 4)
scalar = 10
我们可以执行以下操作:
result1 = v1 + v2
print(result1.x, result1.y) # 输出:4 6
result2 = scalar + v1
print(result2.x, result2.y) # 输出:11 2
在第一个操作中,v1 + v2 调用了 Vector 类中的 __add__()
方法,返回了一个新的 Vector 对象。在第二个操作中,scalar + v1,由于整数与 Vector 类型没有定义的加法操作,Python 解释器会尝试调用 Vector 类中的 __radd__()
方法,此时 self 为 v1,other 为 scalar,返回一个新的 Vector 对象,代表了整数与向量的加法操作。
当你写下 v1 + v2 时,Python 知道如何执行这个操作,因为它知道如何将两个向量相加。但是,假设你写下 3 + v1,Python 怎么知道如何将一个整数和一个向量相加呢?这是因为整数类中没有定义与向量相加的方法。这时,Python 将会检查向量类中是否有一个特殊的方法 __radd__()
,它会尝试调用这个方法。
如果你在向量类中实现了 __radd__()
方法,Python 就会使用它来执行这个操作。这个方法的目的是让你告诉Python当它需要在一个向量和另一个类型的对象之间执行加法时应该怎么做。
所以,实现 __radd__()
方法的目的是为了支持当对象出现在表达式的右侧时的运算,这样你就可以使用你定义的类与其他类型的对象进行运算。
这就是如何使用 __radd__()
方法来支持反向加法操作。其他的反向运算符方法同理,可以类似地实现。
https://docs.python.org/zh-cn/3/reference/datamodel.html#object.__radd__
更新时间:2024-03-05 11:38:51 标签:python 特殊方法 数字