簡體   English   中英

python中的條件重載運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM