我尝试定义类装饰器.我在装饰类中遇到了__init__方法的问题.如果__init__方法调用super,则会引发RuntimeError超出的最大递归深度.
代码示例:
def decorate(cls):
class NewClass(cls): pass
return NewClass
@decorate
class Foo(object):
def __init__(self, *args, **kwargs):
super(Foo, self).__init__(*args, **kwargs)
我究竟做错了什么?
谢谢,Michał
编辑1
感谢Mike Boers的回答,我意识到正确的问题是我应该怎样做才能让超级(Foo,self)指向适当的阶级.
我还有两个限制.我想调用Foo .__ init__方法,我不能改变Foo类的定义.
编辑2
我已经解决了这个问题.我修改了装饰函数体.我不回新课.而不是我包装原始类的方法.
最佳答案 你需要覆盖NewClass .__ init__以防止递归,因为NewClass .__ init__是Foo .__ init__并且它一直在调用自己.
def decorate(cls):
class NewClass(cls):
def __init__(self):
pass
return NewClass
新想法:
如何不进行子类化?也许猴子补丁是你的朋友?
def decorate(cls):
old_do_something = cls.do_something
def new_do_something(self):
print "decorated",
old_do_something(self)
cls.do_something = new_do_something
return cls
@decorate
class Foo(object):
def __init__(self, *args, **kwargs):
super(Foo, self).__init__(*args, **kwargs)
def do_something(self):
print "Foo"
f = Foo()
f.do_something()