gpt4 book ai didi

python - 用 __getattr__ 覆盖魔法方法

转载 作者:行者123 更新时间:2023-12-04 10:46:24 25 4
gpt4 key购买 nike

我有一个类,它是成员的容器。所有成员都属于同一类型。

class A(int):
def __init__(self, n):
super().__init__()
self.n = n

def do(self):
print('adding 10')
return self.n + 10


class B:
def __init__(self, a1, a2):
self.a = [a1, a2]

def __getattr__(self, item):
return getattr(self.a[0], item)


a1 = A(10)
a2 = A(5)
b = B(a1, a2)
__getattr__覆盖 do方法:
In[7]: b.do()
adding 10
Out[7]: 20

甚至覆盖 __add__当显式调用时
In[8]: b.__add__(1)
Out[8]: 11

但是 __add__调用时失败 +
In[9]: b+1
TypeError: unsupported operand type(s) for +: 'B' and 'int'

如何覆盖魔术方法以按预期工作?

最佳答案

运营商不处理的原因__getattr__涵盖在 Why is __getattr__ capable of handling built-in operator overloads in python 2.x?

In new-style classes the special methods are always looked up in the class(implicit lookup) not instance.



我的解决方法(不完美,但允许使其工作)是在 B 中明确定义所需的 dunder 方法,并明确调用 __getattr__在他们:
class B:
def __init__(self, a1, a2):
self.a = [a1, a2]

def __add__(self,other):
return self.__getattr__("__add__")(other)

def __getattr__(self, item):
return getattr(self.a[0], item)

关于python - 用 __getattr__ 覆盖魔法方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59683994/

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