我尝试这样做:
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, *args, **kwargs):
super(myClass, self).__init__(*args, **kwargs)
self.test = 'test'
def test_test(self):
pass
myClass().run()
但我在MyClass.__init__
得到了递归。有什么方法可以避免这种情况吗?
答案 0 :(得分:7)
您不能以这种方式在装饰类中使用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, *args, **kwargs):
unittest.TestCase.__init__(self, *args, **kwargs)
self.test = 'test'
:
super()
这就是为什么在Python 3中引入了__class__
的无参数版本的原因之一,而是为方法提供myClass.__init__()
单元格。
你可以跳过一些(非常棘手的)箍重新编译myClass
方法,给它一个绑定到原始未修饰类对象的{{1}}闭包,但对于单位测试,我不会打扰。