[英]Conditional overloading operator in python
我正在使用python 3(3.3,但我對任何不錯的解決方案都感興趣,即使它只是python 3.4或更高版本也是如此)。 我想用這樣的條件重載運算符創建一個自定義類:
class test :
def __init__(self,overload) :
if overload :
self.__add__=lambda x,y : print("OK")
self.f=lambda : print(True)
def f(self) : print(False)
t=test(False)
t.f() #print False as expected
u=test(True)
u.f() #print True as expected
u+u #fails as if it was not implemented
經過一番挖掘,我意識到操作符+
不會在對象上調用__add__
,而是在類上調用__add__
。 因此,我不能那樣做(還是可以)?
所以我可以這樣定義:
class test :
def __init__(self,overload) :
self.overload=overload
def __add__(self,other) :
if self.overload : print("OK")
else #FAILURE
def f(self) : print(self.overload)
但是, 我可以在FAILURE
語句中放入什么使其完全像未實現一樣失敗? 例如,如果失敗,那么如果它在第二個運算符上嘗試__radd__
,我會很高興。
實際上,在類型上會查找特殊方法,因此無法在實例上進行設置。
如果您不希望始終支持.__add__
返回NotImplemented
單例:
class test:
def __init__(self, overload):
self.overload = overload
def __add__(self, other):
if not self.overload:
return NotImplemented
print("Ok")
從豐富的比較方法返回NotImplemented
使Python表現得好像沒有這樣的方法。 這通常是用於通知的類型 , other
不被支持,但你可以自由地回到它,當你不想要支持的操作剛才 。
請注意,Python仍將嘗試反向操作; 對於test() + something
,Python首先嘗試test().__add__(something)
,然后如果第一個操作返回NotImplemented
則調用something.__radd__(test())
。 如果后者不存在或還返回NotImplemented
,則會引發TypeError
。
演示:
>>> class test:
... def __init__(self, overload):
... self.overload = overload
... def __add__(self, other):
... if not self.overload:
... return NotImplemented
... print("Ok")
...
>>> test(False) + 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'instance' and 'int'
>>> test(True) + 1
Ok
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.