首页 > 解决方案 > 列出来自 functool 部分的装饰器方法

问题描述

我有来自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']

它既适用于作为对象的类。

标签: pythonpython-decoratorsfunctools

解决方案


将其发布为解决方案,因为我还不能发表评论。可能会重蹈覆辙。


推荐阅读