gpt4 book ai didi

python - python中的条件重载运算符

转载 作者:行者123 更新时间:2023-11-28 21:55:39 27 4
gpt4 key购买 nike

我正在使用 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__ 我会很高兴。

最佳答案

确实,特殊方法是在类型上查找的,您不能在实例上设置它们。

如果你不想总是支持 .__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 表现得好像没有这样的方法;通常这用于表示 othertype 不受支持,但是当您不想支持该操作时可以自由返回它 就在现在

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com