gpt4 book ai didi

python - 为什么我不能覆盖这个魔术方法?

转载 作者:行者123 更新时间:2023-12-01 05:22:45 24 4
gpt4 key购买 nike

我正在制作一个包装器对象,该对象将采用任意类的实例,然后自动包装其所有自己的魔术方法,以简单地使用包装对象的魔术方法(和值)。由于某种原因,这不起作用:

class Wrapper:
def __init__(self, wrapped):
self.wrapped = wrapped
for method in filter(lambda x: x.startswith("__") and (x not in
["__init__", "__new__", "__class__", "__metaclass__"]),
dir(wrapped)):
if hasattr(getattr(wrapped, method), "__call__"):
new_func = functools.partial(getattr(type(wrapped), method), self.wrapped)
setattr(self, method, new_func)


t = Wrapper(7)
t + 8
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'Wrapper' and 'int'

class Tester:
def __init__(self):
self.v = 5
def __add__(self, other):
return self.v + other

y = Tester()
y + 7
12
t = Wrapper(y)
t + 9
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'Wrapper' and 'int'

9 + t
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'Wrapper'

t.__add__
functools.partial(<function Tester.__add__ at 0x7fbec6372170>, <__main__.Tester object at 0x7fbec6392990>)

t.__add__(7)
12

我认为部分方法可能无法正常工作,因为类型方法和实例方法之间存在区别,但是当我直接调用包装器的 magic add 时,它可以正常工作。 (这是在CPython 3.3中测试的)

最佳答案

特殊方法有always looked up on the type of the instance (这里是类对象),而不是实例上。否则,当您尝试打印类本身的表示时,将使用类上的 __repr__type(class).__repr__(class) 将使用正确的魔术方法,而 class.__repr__() 会引发异常,因为 self 是未提供。

您需要直接在包装器上实现这些特殊方法,传播在包装对象上调用时可能引发的任何异常。

关于python - 为什么我不能覆盖这个魔术方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21990320/

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