【发布时间】:2015-05-14 01:15:47
【问题描述】:
目前,我正在使用装饰器将类中的方法动态添加到列表中;这样我可以在需要时同时遍历所有这些,并且我没有一次手动添加它们:
predicates_list = []
def predicate(func):
predicates_list.append(func)
return func
class Person(object):
@predicate
def name_is_bill(self, name):
return True if name == 'bill' else False
def test_everything(self, tester):
if any(predicate(name) for predicate in predicates_list:
return True
else:
return False
但是,将装饰函数和列表放在 Person 类的范围之外是没有意义的——只有 Person 类或其子类会使用它。尝试将装饰器函数设为类方法或静态方法时,我没有运气。
作为一个类方法,我收到关于需要两个参数的错误。 (这个错误是有道理的,但我是否需要将cls 或self 作为装饰器中的第一个参数传递?如果需要,怎么做?)
作为静态方法,我无权访问类的属性。我可以在装饰器函数中指定类的名称,但是如果我需要对 Person 进行子类化,我会遇到问题。
必须有一种优雅的方式来做到这一点,但我没有想法。
【问题讨论】:
标签: python oop python-decorators