Python类装饰器和超出的最大递归深度
发布时间:2020-12-20 11:14:03 所属栏目:Python 来源:网络整理
导读:我尝试定义类装饰器.我在装饰类中遇到了__init__方法的问题.如果__init__方法调用super,则会引发RuntimeError超出的最大递归深度. 代码示例: def decorate(cls): class NewClass(cls): pass return NewClass@decorateclass Foo(object): def __init__(self,
我尝试定义类装饰器.我在装饰类中遇到了__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,**kwargs) def do_something(self): print "Foo" f = Foo() f.do_something() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |