Python 为内置实例和类实例定义运算符

Python 为内置实例和类实例定义运算符,python,Python,在Python中,您可以通过定义\uuuuu add\uuuu来覆盖类的操作(比如,加法)。这将使添加具有其他值/实例的类实例成为可能,但不能向实例添加内置项: foo = Foo() bar = foo + 6 # Works bar = 6 + foo # TypeError: unsupported operand type(s) for +: 'int' and 'Foo' 是否有任何方法使其启用?当实例位于右侧时,必须定义重写运算符+的方法。不能重写整数的+运算符。您应该做的是仅在F

在Python中,您可以通过定义
\uuuuu add\uuuu
来覆盖类的操作(比如,加法)。这将使添加具有其他值/实例的类实例成为可能,但不能向实例添加内置项:

foo = Foo()
bar = foo + 6 # Works
bar = 6 + foo # TypeError: unsupported operand type(s) for +: 'int' and 'Foo'

是否有任何方法使其启用?

当实例位于右侧时,必须定义重写运算符
+
的方法。

不能重写整数的+运算符。您应该做的是仅在Foo类中重写
\uuu\radd\uuu(self,other)
函数。
self
变量引用一个
Foo
实例,而不是整数,
other
变量引用+运算符左侧的对象。当计算
bar=6+foo
时,尝试计算
6.\uuuu add\uuuu(foo)
失败,然后Python尝试
foo.\uuuu radd\uuuu(6)
(反向
\uu add\uu
)。如果您在
Foo
内部覆盖
\uuuuuradd\uuuuu
,则反向的
\uuuuuuu添加\uuuuu
成功,并且
6+Foo
的计算是
Foo.\uuuuuradd\uuuuuu6)
的结果


请注意,Python仍将尝试调用
\uuuuu add\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我只有一个小的更正。您编写的
other
变量引用右侧的对象,但它应该位于左侧。@halex:谢谢您的更正。我肯定是有意的。
def __radd__(self, other):
   return self + other