我正在使用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}},我会很高兴。
答案 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