检索在实例上调用的二元运算符

时间:2011-08-28 11:49:27

标签: python

我一直在通过object.__add__(self,other)之类的overload numeric operators等课堂特殊方法。

是否有泛型方法来找出调用了哪个二元运算符?

对于一元运算符,您可以使用__getattr__,例如:

class Test():
  def __getattr__(self, name):
    print name
t = Test()
~t  # prints __invert__

但是调用二元运算符,例如t+tt+5始终会调用__coerce__,这会丢失有关运营商的信息。


基于Jochen Ritzel的答案的解决方案:最简单的方法是将以下内容添加到上述类中:

def __coerce__(self, other):
  self.other = other    # store 'other' somewhere we can access it
  return None

然后__getattr__(在__coerce__之后调用)可以访问两个操作数 - selfself.other - 以及操作 - {{1} }。

然而事实证明,尝试通过name使用动态调度几乎肯定是一个真正坏主意,而不仅仅是定义您实际需要的特殊方法,就像运营商一样(相对于属性)Python实际上会调用__getattr__返回的任何内容。

(希望更新我的问题是好的,似乎不适合评论框)

1 个答案:

答案 0 :(得分:0)

t+t拨打__coerce__,然后拨打__add____coerce__应该将(数字)类型转换为公共类,例如1.0 + 2首先将两个数字强制转换为浮点数。

如果您想要做一些特别的事情,可以从__coerce__返回看到以下运算符的代理对象。