我试图修补一个类的__new__
方法,但它不像我期望的那样工作。
from contextlib import contextmanager
class A:
def __init__(self, arg):
print('A init', arg)
@contextmanager
def patch_a():
new = A.__new__
def fake_new(cls, *args, **kwargs):
print('call fake_new')
return new(cls, *args, **kwargs)
# here I get error: TypeError: object.__new__() takes exactly one argument (the type to instantiate)
A.__new__ = fake_new
try:
yield
finally:
A.__new__ = new
if __name__ == '__main__':
A('foo')
with patch_a():
A('bar')
A('baz')
我期望以下输出结果:
A init foo
call fake_new
A init bar
A init baz
但是在调用 fake_new
后,我得到了一个错误(请参见代码中的注释)。
对我来说,似乎我只是装饰了一个 __new__
方法并传递了所有参数而没有改变它们。
这不起作用,原因对我来说很模糊。
此外,我可以写成 return new(cls)
并且调用 A('bar')
没有问题。但之后调用 A('baz')
就会出问题。
有人能解释一下发生了什么吗?
Python版本为3.8
A.__new__
是object.__new__
,它只接受一个参数。你应该简单地调用它:new(cls)
。我不明白为什么使用'baz'
的调用会失败... 很奇怪... - juanpa.arrivillaga