gpt4 book ai didi

python - 在 Python 中使用 __getattr__ 重载运算符

转载 作者:行者123 更新时间:2023-12-04 12:04:11 27 4
gpt4 key购买 nike

我正在尝试使用 __getattr__ 一次重载多个运算符功能。在我的代码中,如果我调用 foo.__add__(other)它按预期工作,但是当我尝试时 foo + bar , 它不是。这是一个最小的例子:

class Foo():


def add(self, other):
return 1 + other

def sub(self, other):
return 1 - other

def __getattr__(self, name):

stripped = name.strip('_')
if stripped in {'sub', 'add'}:
return getattr(self, stripped)
else:
return

if __name__=='__main__':

bar = Foo()

print(bar.__add__(1)) # works
print(bar + 1) # doesn't work
我意识到在这个例子中只定义 __add__ 会更容易和 __sub__ ,但这不是我的选择。
另外,作为一个小问题,如果我替换该行:
if stripped in {'sub', 'add'}:
if hasattr(self, name):
代码有效,但随后我的 iPython 内核崩溃了。为什么会发生这种情况,我该如何预防?

最佳答案

发生这种情况是因为 python 运算符使用优化来查找实现该运算符的函数。以下几行大致等效:

foo + 1
type(foo).__add__(foo, 1)
运算符仅在类对象上专门找到,从不在实例上。 bar.__add__(1)电话 __getattr__bar 上找到缺失的属性.这是有效的,因为它绕过了正常的运算符查找过程。 bar + 1电话 Foo.__add__(bar, 1)其次是 int.__radd(1, bar) .第一个属性查找失败,第二个选项引发 TypeError .

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

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