我试着这样做:
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__中得到了递归.有什么方法可以避免这种情况吗?
最佳答案 您不能以这种方式在装饰类中使用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'
这就是为什么在Python 3中引入了无参数版本的super()的原因之一,为方法提供了一个__class__单元格.
你可以跳过一些(非常棘手的)箍来重新编译myClass .__ init __()方法,给它一个绑定到原始未修饰类对象的myClass闭包,但对于单元测试,我不会打扰.