类的Python装饰器

时间:2013-12-13 14:57:58

标签: python python-2.7 decorator 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()

但我在MyClass.__init__得到了递归。有什么方法可以避免这种情况吗?

1 个答案:

答案 0 :(得分:7)

您不能以这种方式在装饰类中使用super(myClass, self)

myClass被视为全局,而全局myClass 反弹Decorator,所以你告诉Python查看MRO类__init__Decorator开始,myClasssuper(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}}闭包,但对于单位测试,我不会打扰。