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

Python 如何在类中移动此方法装饰器模式?,python,oop,python-decorators,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

目前,我正在使用装饰器将类中的方法动态添加到列表中;通过这种方式,我可以在需要的时候同时对所有这些文件进行迭代,而不必一次手动添加每一个文件:

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类或其子类才会使用它。我没有运气尝试将decorator函数设置为类方法或静态方法

作为一个类方法,我会遇到需要两个参数的错误。(这个错误是有道理的,但是我是否需要将
cls
self
作为decorator中的第一个参数传递?如果是,如何传递?)

作为一个静态方法,我没有访问类属性的权限。我可以在decorator函数中指定类的名称,但如果需要将Person子类化,我会遇到问题


一定有一个优雅的方法来做这件事,但我已经没有主意了

您使用的模式看起来是正确的。官方文档中的大多数示例都使用与您采用的模式相同的模式—类外的decorator定义。例如,请看这个例子。

我仍然认为它很丑陋,不必要地污染了我的全局名称空间,但我服从了大多数人的意愿。值得一提的是,我并不反对你的观点:)作为一个Pythonista,你知道这门语言的实用性往往以牺牲美为代价。