我正在使用Python3(3.3,但我对任何好的解决方案都感兴趣,即使它只是Python3.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__,而是对类调用。所以,我不能那样做(或者我可以这样做)?
所以我可以这样定义:
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),如果第一个操作返回something.__radd__(test()),则调用NotImplemented。如果后者不存在,也返回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

关于python - python中的条件重载运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22579936/

10-11 20:44