Python类装饰器和超出的最大递归深度

Python类装饰器和超出的最大递归深度,第1张

概述我尝试定义类装饰器.我在装饰类中遇到了__init__方法的问题.如果__init__方法调用super,则会引发RuntimeError超出的最大递归深度. 代码示例: def decorate(cls): class NewClass(cls): pass return NewClass@decorateclass Foo(object): def __init_ 我尝试定义类装饰器.我在装饰类中遇到了__init__方法的问题.如果__init__方法调用super,则会引发RuntimeError超出的最大递归深度.

代码示例:

def decorate(cls):    class NewClass(cls): pass    return NewClass@decorateclass 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@decorateclass Foo(object):    def __init__(self,**kwargs)    def do_something(self):        print "Foo"f = Foo()f.do_something()
总结

以上是内存溢出为你收集整理的Python类装饰器和超出的最大递归深度全部内容,希望文章能够帮你解决Python类装饰器和超出的最大递归深度所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1192387.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存