2015-04-18 30 views
2

我知道可以创建一个object.__mul__(self, other)方法来启用两个对象的自定义乘法。然而,在python文档所解释,Python:使自定义对象与/与标准类型相乘

来计算表达式x + y,其中x是具有__add__()方法的类 的实例,x.__add__(y)被调用。

是否有可能以任何方式,以允许以相反的顺序自定义乘法/加法的对象,即y + x,其中x是我们可以控制的实例,并y是标准型,例如的浮动?

回答

6

是的,这是可能的。

事实上,它只是在你看到的相同文档中的半页内容中解释。您只需定义一个__rmul__(self, other)方法。

由于文档说:

这些方法称为执行二进制算术运算(+-*/%divmod()pow()**<<>>&^|)与反射(交换)操作数。这些函数仅在左操作数不支持相应操作且操作数具有不同类型时才会调用。例如,为了评估表达式x - y,其中是具有__rsub__()方法的类的实例,如果x.__sub__(y)返回NotImplemented,则调用y.__rsub__(x)

所以:

>>> class Thingy(object): 
...  def __mul__(self, other): 
...   print('mul', other) 
...  def __rmul__(self, other): 
...   print('rmul', other) 
>>> thingy = Thingy() 
>>> thingy * 3 
mul 3 
>>> 3 * thingy 
rmul 3 

查看关于子类的注意,如果是相关的;对于内置类型,通常不是。

另外请注意,没有__rlt__,__req__等,但应用相同的规则;只是反射是您已经定义的__gt____eq__等方法。