Eug*_*ene 3 python decorator python-2.7 python-decorators
我试着这样做:
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()
Run Code Online (Sandbox Code Playgroud)
但我得到了递归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'
Run Code Online (Sandbox Code Playgroud)
这就是为什么在Python 3 super()中引入了无参数版本的原因之一,__class__而是为方法提供了一个单元格.
你可以跳过一些(非常棘手的)箍重新编译myClass.__init__() 方法,给它一个myClass绑定到原始未修饰的类对象,但对于单元测试,我不会打扰.