我運行了下面的代碼;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剛才發(fā)生了什么?為什么是a.f == b和b.f == 2。我想知道這是否是某種明確的行為,我沒有正確解釋。
1 回答

犯罪嫌疑人X
TA貢獻2080條經(jīng)驗 獲得超4個贊
該線路在 上
a + b
呼叫__add__
接線員a
。+=
不起作用 ( ) 并因此int + A
調(diào)用__radd__
onb
。在這里,
b.f
接收值2
并將自身作為對象返回。然后將此對象分配給
a.f
.
所以一切都符合預(yù)期,除了非常不尋常的編碼方式。我希望您編寫的代碼不會傷害到任何人。
即使您堅持自己的編碼,讓我(至少對于其他讀者)建議定義這些運算符的正常方法:
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
現(xiàn)在你可以計算a+b,2+a等等a+2。
添加回答
舉報
0/150
提交
取消