我正在使用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/