我一直在通过object.__add__(self,other)
之类的overload numeric operators等课堂特殊方法。
是否有泛型方法来找出调用了哪个二元运算符?
对于一元运算符,您可以使用__getattr__
,例如:
class Test():
def __getattr__(self, name):
print name
t = Test()
~t # prints __invert__
但是调用二元运算符,例如t+t
或t+5
始终会调用__coerce__
,这会丢失有关运营商的信息。
基于Jochen Ritzel的答案的解决方案:最简单的方法是将以下内容添加到上述类中:
def __coerce__(self, other):
self.other = other # store 'other' somewhere we can access it
return None
然后__getattr__
(在__coerce__
之后调用)可以访问两个操作数 - self
和self.other
- 以及操作 - {{1} }。
然而事实证明,尝试通过name
使用动态调度几乎肯定是一个真正坏主意,而不仅仅是定义您实际需要的特殊方法,就像运营商一样(相对于属性)Python实际上会调用__getattr__
返回的任何内容。
(希望更新我的问题是好的,似乎不适合评论框)
答案 0 :(得分:0)
t+t
拨打__coerce__
,然后拨打__add__
。 __coerce__
应该将(数字)类型转换为公共类,例如1.0 + 2
首先将两个数字强制转换为浮点数。
如果您想要做一些特别的事情,可以从__coerce__
返回看到以下运算符的代理对象。