我运行了下面的代码;class A: def __init__(self): self.f = 1 def __add__(self, x): self.f += x return self def __radd__(self, x): self.f += x return self>>> a = A()>>> a + 2<__main__.A object at 0x7f96a90d5700>>>> a.f == 3True# as expected, so far>>> a = A()>>> b = A()>>> a + b<__main__.A object at 0x7f3d86d7c700>>>> a.f<__main__.A object at 0x7f3d86d7cb80>>>> b.f2>>> a.f.f2>>> a.f is bTrue刚才发生了什么?为什么是a.f == b和b.f == 2。我想知道这是否是某种明确的行为,我没有正确解释。
1 回答
犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
该线路在 上
a + b
呼叫__add__
接线员a
。+=
不起作用 ( ) 并因此int + A
调用__radd__
onb
。在这里,
b.f
接收值2
并将自身作为对象返回。然后将此对象分配给
a.f
.
所以一切都符合预期,除了非常不寻常的编码方式。我希望您编写的代码不会伤害到任何人。
即使您坚持自己的编码,让我(至少对于其他读者)建议定义这些运算符的正常方法:
def __add__(self, x):
result = A()
try:
result.f = self.f + x.f
except AttributeError:
result.f = self.f + x
return result
def __radd__(self, x):
result = A()
try:
result.f = self.f + x.f
except AttributeError:
result.f = self.f + x
return result
现在你可以计算a+b,2+a等等a+2。
添加回答
举报
0/150
提交
取消