【问题标题】:List decorator methods from functool partial列出来自 functool 部分的装饰器方法
【发布时间】:2021-11-04 10:22:53
【问题描述】:

我有来自https://stackoverflow.com/a/46361833/5316326 的这个类方法装饰器,它接受参数。

如何在创建的对象上列出使用此装饰器的类方法?

from functools import update_wrapper, partial

def my_decorator(name):
    class MyDecorator(object):
        def __init__(self, func):
            update_wrapper(self, func)
            self.func = func

        def __get__(self, obj, objtype):
            """Support instance methods."""
            return partial(self.__call__, obj)

        def __call__(self, obj, *args, **kwargs):
            return self.func(obj, *args, **kwargs)

    return MyDecorator

class MyClass(object):

    t=12
    
    @my_decorator("hee")
    def my_method(self, a):
        print(a+self.t)

以下尝试可行,但通过将部分函数解析为字符串,应该有正确的实现:

def find_my_decorators(cls):
    def g():
        for name in dir(cls):
            attr = getattr(cls, name)
            if isinstance(attr, partial) and 'MyDecorator' in str(attr.func):
                yield name

    return [name for name in g()]

然而,它给出了预期的结果:

>>> find_my_decorators(MyClass)
['my_method']
>>> m = MyClass()
>>> m.my_method(a=12)
>>> find_my_decorators(m)
['my_method']

它既可以作为对象在类上工作。

【问题讨论】:

标签: python python-decorators functools


【解决方案1】:

发布此作为解决方案,因为我还不能发表评论。 this 可能重复。

【讨论】:

  • 不确定您提出了哪个答案,但源代码解析很难看,而且很难按名称查找函数,因为它们都被命名为partial。我认为方法注册表会起作用
猜你喜欢
  • 2013-01-16
  • 1970-01-01
  • 2020-01-11
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 2018-11-28
  • 2019-02-22
相关资源
最近更新 更多