从装饰器访问自我

Posted

技术标签:

【中文标题】从装饰器访问自我【英文标题】:Access self from decorator 【发布时间】:2011-11-27 06:54:46 【问题描述】:

在 unittest 的 setUp() 方法中,我设置了一些 self 变量,稍后在实际测试中会引用这些变量。我还创建了一个装饰器来做一些日志记录。有没有一种方法可以让我从装饰器中访问那些 self 变量?

为简单起见,我发布此代码:

def decorator(func):
    def _decorator(*args, **kwargs):
        # access a from TestSample
        func(*args, **kwargs)
    return _decorator

class TestSample(unittest.TestCase):    
    def setUp(self):
        self.a = 10

    def tearDown(self):
        # tear down code

    @decorator
    def test_a(self):
        # testing code goes here

从装饰器访问 a(在 setUp() 中设置)的最佳方式是什么?

【问题讨论】:

【参考方案1】:

由于您正在装饰一个方法,并且self 是一个方法参数,因此您的装饰器可以在运行时访问self。显然不是在解析时,因为还没有对象,只是一个类。

所以你把你的装饰器改成:

def decorator(func):
    def _decorator(self, *args, **kwargs):
        # access a from TestSample
        print 'self is %s' % self
        return func(self, *args, **kwargs)
    return _decorator

【讨论】:

以上是关于从装饰器访问自我的主要内容,如果未能解决你的问题,请参考以下文章

类装饰器不绑定自我

如何从方法装饰器访问类元数据

Python装饰器,自我混淆[重复]

Python装饰器,自我混淆[重复]

为方法跳过“自我”的装饰器

实例方法的装饰器可以访问该类吗?