加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

类的Python装饰器

发布时间:2020-12-20 11:32:09 所属栏目:Python 来源:网络整理
导读:我试着这样做: import unittestdef decorator(cls): class Decorator(cls): def __init__(self,*args,**kwargs): super(Decorator,self).__init__(*args,**kwargs) return Decorator@decoratorclass myClass(unittest.TestCase): def __init__(self,**kwarg
我试着这样做:

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,**kwargs):
        super(myClass,**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,**kwargs):
        unittest.TestCase.__init__(self,**kwargs)
        self.test = 'test'

这就是为什么在Python 3中引入了无参数版本的super()的原因之一,为方法提供了一个__class__单元格.

你可以跳过一些(非常棘手的)箍来重新编译myClass .__ init __()方法,给它一个绑定到原始未修饰类对象的myClass闭包,但对于单元测试,我不会打扰.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读