例如,如果我在两个类中定义__add__
和__radd__
并且我将两个对象相加,那么python将使用哪个操作定义?
答案 0 :(得分:4)
如果左手和右手对象不相关,则左手对象获胜。但是,如果任一对象是另一个对象的子类,则无论是左对象还是右手对象,子类都会获胜。
>>> class Foo(object):
... def __add__(self, rhs):
... print('foo.add')
... def __radd__(self, rhs):
... print('foo.radd')
...
>>> class Bar(Foo):
... def __add__(self,rhs):
... print('bar.add')
... def __radd__(self, rhs):
... print('bar.radd')
...
>>> a=Foo()
>>> b=Bar()
>>> a+b
bar.radd
>>> b+a
bar.add
>>>
答案 1 :(得分:1)
对于表达式lhs + rhs
,Python将首先尝试lhs.__add__(rhs)
,然后rhs.__radd__(lhs)
。
答案 2 :(得分:1)
我也不确定,所以我自己尝试 :
In [84]: class Foo(object):
...: def __add__(self, rhs):
...: print 'foo.add'
...:
...: class Bar(object):
...: def __radd__(self, lhs):
...: print 'bar.radd'
...:
...: f=Foo(); b=Bar()
...: f+b
...: 1+b
foo.add
bar.radd
然后我现在记住规则。