有人可以向我解释为什么A()+A()
确实会出错,但B()+B()
会按预期工作吗?当我编写更大的代码时,我遇到了这个问题,但这似乎是重现代码所需的最小代码。
from types import MethodType
D = {'__add__': lambda x, y: "".join((repr(x), repr(y)))}
class A(object):
def __getattr__(self, item):
if item == '__coerce__':
raise AttributeError()
return MethodType(D[item], self)
def __repr__(self):
return "A"
class B():
def __getattr__(self, item):
if item == '__coerce__':
raise AttributeError()
return MethodType(D[item], self)
def __repr__(self):
return "B"
try:
A()+A()
except Exception as e:
print e
B()+B()
有没有人有解释?
答案 0 :(得分:5)
这是因为新样式类永远不会使用二元运算符调用__coerce__
。此外,对于特殊方法__getattr__
永远不会在新样式类中调用:来自数据模型coercion rules:
新式类(从对象派生的类)永远不会调用 响应二元运算符的
__coerce__()
方法;调用内置函数__coerce__()
的唯一时间coerce()
。