gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:17:13 25 4
gpt4 key购买 nike

我有一个 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,则会引发错误。我可以用装饰器来完成这个——最好只用一个吗? (我已经看到了使用类装饰器的解决方案,但我不确定它是否如我所愿!)。奖励积分,以很好地解释为什么我不能;)

最佳答案

装饰器是普通函数,self 也不异常(exception)。假设我编写了一个装饰器函数,它接受一个名为 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 是否为 none,因为您刚刚装饰了它。同样,如果类没有状态,则会按预期引发异常。

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

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

关于用于访问实例变量的 Python 方法装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38286098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com