如何在类中移动此方法装饰器模式?

时间:2015-03-12 01:14:58

标签: python oop python-decorators

目前,我正在使用装饰器将类中的方法动态添加到列表中;通过这种方式,我可以在需要时同时迭代所有这些,并且我没有一次手动添加它们:

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类或其子类才会使用它。我没有运气试图使装饰器功能成为类方法或静态方法。

作为一个类方法,我得到关于需要两个参数的错误。 (这个错误是有道理的,但是我需要将clsself作为装饰器中的第一个参数传递吗?如果是,那怎么办?)

作为静态方法,我无权访问类的属性。我可以在装饰器函数中指定类的名称,但如果我需要继承Person,我会遇到问题。

必须有一种优雅的方式来做到这一点,但我没有想法。

1 个答案:

答案 0 :(得分:1)

您使用的模式看起来是正确的。官方Python Decorator Library中的大多数示例都使用了您采用的相同模式 - 类外的装饰器定义。例如,请参阅Property Definition示例。