类的Python装饰器

我试着这样做:

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闭包,但对于单元测试,我不会打扰.

点赞