2011-08-28 24 views
2

我一直在使用overload numeric operators通過object.__add__(self,other)等類特殊方法.檢索在實例上調用的二元運算符

是否有通用方法來找出哪個二進制運算符被調用了?

對於一元運算符,您可以使用__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 - 以及操作 - 如name

然而事實證明,嘗試通過__getattr__使用動態調度幾乎可以肯定是真的是糟糕的想法與僅僅定義你真正需要的特殊方法相比,對於運算符(而不是屬性)Python實際上會調用任何__getattr__回報。

(希望更新我的問題還可以,似乎不適合評論框)

回答

0

t+t電話__coerce__然後__add____coerce__應該將(數字)類型轉換爲普通類,例如1.0 + 2首先將兩個數字都強制轉換爲浮點數。

如果你想做一些特別的事情,你可以返回代碼對象__coerce__看到下面的運算符。