Python方法装饰器访问实例变量

时间:2016-07-09 20:30:48

标签: python python-2.7

我有一个Python类,它有几个状态变量 - 让我们称之为self.stateself.process

class MyClass(object):
    def __init__(state=None, process=None):
        self.state = state
        self.process = process

现在,如果self.stateself.process都没有,我有很多方法会产生错误。我不想为每个人手动编码测试,所以我在想,我会做一个装饰师 - 就像这样:

class MyClass(object):
    ...

    @needs_state
    def some_function():
        # do something

现在,如果调用some_function()self.stateNone,则会引发错误。我可以用装饰器完成这个 - 最好只用一个吗? (我已经看过使用类装饰器的解决方案,我不确定它是否按照我的意愿行事!)。奖金积分可以很好地解释为什么我不能;)

1 个答案:

答案 0 :(得分:7)

是的,装饰器是普通的函数,因此self也不例外。所以,让我说我写了一个装饰函数,它接受一个名为self的参数:

def needs_state(fn):
    def decorator(self, *args, **kwargs):
        if self.state is None:
            raise ValueError('Oh no')
        return fn(self, *args, **kwargs)
    return decorator

它不知道self是什么,因为它不在一个类中,但没关系,你可以按照你期望的方式在类中使用装饰器。

class MyClass(object):

    def __init__(self, state=None):
        self.state = state

    @needs_state
    def some_function(self):
        print self.state

所以,如果你现在用任何东西实例化该类,你的some_function将首先检查self.state是否为空,因为你刚装饰它。同样,如果类没有状态,则会按预期引发异常。

MyClass(1).some_function()  # 1
MyClass(None).some_function()  # raises

self.process被遗漏了,所以你需要做一些工作。