python中的条件重载运算符

时间:2014-03-22 15:57:43

标签: python python-3.x operator-overloading

我正在使用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__,而是在类上调用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__语句中,以便它如果未实现则完全失败?例如,如果它失败了,如果它在第二个操作符上尝试{{1}},我会很高兴。

1 个答案:

答案 0 :(得分:5)

实际上,在类型上查找特殊方法,您无法在实例上设置它们。

如果您不想一直支持.__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类型,但是当您不想支持刚才的操作时,您可以自由地返回它/ em>的

请注意,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