在python中的两个对象之间的操作中,哪个操作的重载优先级?

时间:2014-04-26 01:44:51

标签: python class operator-overloading

例如,如果我在两个类中定义__add____radd__并且我将两个对象相加,那么python将使用哪个操作定义?

3 个答案:

答案 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

然后我现在记住规则。