类的Python装饰器

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__.有什么方法可以避免这种情况吗?

Mar*_*ers 7

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

myClass正在抬头为全球性的,全球myClass反弹Decorator,所以你告诉的Python在类MRO寻找__init__从开始DecoratormyClass,它要求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绑定到原始未修饰的类对象,但对于单元测试,我不会打扰.