类的Python装饰器

2024-03-28 11:56:36 发布

您现在位置: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__中的递归。有什么办法可以避免这种情况吗?在


Tags: testimportselfreturninitdefmyclassargs
1条回答
网友
1楼 · 发布于 2024-03-28 11:56:36

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

myClass被作为一个全局查找,而全局{}是反弹Decorator,因此您告诉Python从Decorator开始在类MRO中查找__init__,它调用super(myClass, self).__init__(),将{}作为一个全局查找,它绑定到Decorator,等等

最简单的解决方法是不要在此处使用super()

@decorator
class myClass(unittest.TestCase):
    def __init__(self, *args, **kwargs):
        unittest.TestCase.__init__(self, *args, **kwargs)
        self.test = 'test'

这就是Python3中引入super()的无参数版本的原因之一,而是给方法一个__class__单元格。在

您可以跳过一些(非常棘手的)循环来重新编译myClass.__init__()方法,从而给它一个绑定到原始未修饰类对象的myClass闭包,但是对于unittest,我不会费心。在

相关问题 更多 >