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

Posted

技术标签:

【中文标题】如何在类中移动这个方法装饰器模式?【英文标题】:How do I move this method-decorator pattern inside a class? 【发布时间】: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 类或其子类会使用它。尝试将装饰器函数设为类方法或静态方法时,我没有运气。

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

好吧,我还是说它很丑,它不必要地污染了我的全局命名空间,但我服从大多数人的意愿。 对于它的价值,我不同意你的观点:) 作为一名 Pythonista,你知道这种语言通常是以牺牲美感为代价的。

以上是关于如何在类中移动这个方法装饰器模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在类中定义装饰器?

python_如何在类中定义装饰器

Python 装饰器装饰类中的方法

如何在类中使用 Pyomo 装饰器

如何在不显式导入的情况下使新的装饰器在类中可用?

在类中的所有实例方法自动调用之后调用方法:元类还是装饰器?