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

Chr*_*vCB 1 python python-2.7

我有一个有几个状态变量的Python类-让我们称他们self.stateself.process:

class MyClass(object):
    def __init__(state=None, process=None):
        self.state = state
        self.process = process
Run Code Online (Sandbox Code Playgroud)

现在,我的应该产生一个错误,如果方法有很多self.state,并self.process没有.我不想为每个人手动编码测试,所以我在想,我会做一个装饰器 - 像这样:

class MyClass(object):
    ...

    @needs_state
    def some_function():
        # do something
Run Code Online (Sandbox Code Playgroud)

现在,如果some_function()被调用,但self.stateNone,错误将得到提升.我可以用装饰器完成这个 - 最好只用一个吗?(我已经看到使用类装饰器的解决方案,我不确定它做了我希望它做了什么!).奖金积分可以很好地解释为什么我不能;)

Bri*_*ian 8

是的,装饰器是普通的功能,所以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
Run Code Online (Sandbox Code Playgroud)

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

class MyClass(object):

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

    @needs_state
    def some_function(self):
        print self.state
Run Code Online (Sandbox Code Playgroud)

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

MyClass(1).some_function()  # 1
MyClass(None).some_function()  # raises
Run Code Online (Sandbox Code Playgroud)

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