【发布时间】: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 3 并且不捕获部分方法
-
有问题
标签: python python-decorators functools