类的Python装饰器
发布时间:2020-12-20 11:32:09 所属栏目:Python 来源:网络整理
导读:我试着这样做: import unittestdef decorator(cls): class Decorator(cls): def __init__(self,*args,**kwargs): super(Decorator,self).__init__(*args,**kwargs) return Decorator@decoratorclass myClass(unittest.TestCase): def __init__(self,**kwarg
我试着这样做:
import unittest def decorator(cls): class Decorator(cls): def __init__(self,*args,**kwargs): super(Decorator,self).__init__(*args,**kwargs) return Decorator @decorator class myClass(unittest.TestCase): def __init__(self,**kwargs): super(myClass,**kwargs) self.test = 'test' def test_test(self): pass myClass().run() 但是我在MyClass .__ init__中得到了递归.有什么方法可以避免这种情况吗? 解决方法
您不能以这种方式在装饰类中使用super(myClass,self).
myClass被查找为全局,并且全局myClass会反弹到Decorator,所以你告诉Python在类MRO中查找__init__,从Decorator开始,这是myClass,它调用super(myClass,self).__ init __(),查找myClass作为全局,绑定到Decorator等. 最简单的解决方法是不要在这里使用super(): @decorator class myClass(unittest.TestCase): def __init__(self,**kwargs): unittest.TestCase.__init__(self,**kwargs) self.test = 'test' 这就是为什么在Python 3中引入了无参数版本的super()的原因之一,为方法提供了一个__class__单元格. 你可以跳过一些(非常棘手的)箍来重新编译myClass .__ init __()方法,给它一个绑定到原始未修饰类对象的myClass闭包,但对于单元测试,我不会打扰. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |