【发布时间】:2018-02-06 20:24:01
【问题描述】:
使用 python 3.6。我正在尝试编写一些代码,允许我在类方法上放置一个唯一标识符。
这是一个例子:
def test(func):
def wrap():
pass
wrap.__name__ += '_TEST'
return wrap
class example:
@test
def method(self):pass
控制台:
import inspect
Bar = example()
inspect.getmembers(Bar, predicate=inspect.ismethod)
Out[3]:
[('method', # Name didn't change
<bound method test.<locals>.wrap of <__main__.example object at
0x000002670E073EF0>>)]
Bar.method.__name__
Out[4]: 'wrap_TEST'
我希望能够遍历一个类的方法,并且只执行我用我的装饰器标记的方法。这个可以吗?
【问题讨论】:
-
方法查找不会返回实际函数,它们本身就是函数的薄包装。如果您检查,您的实际功能已被重命名:
Bar.method.__func__.__name_. -
你能解释一下装饰者想要达到什么目的吗?这样做似乎有点太复杂了。装饰器是真的改变了函数的行为方式还是只改变了名字?
-
这也是由于
gemembers()works 的方式,它使用dir()来获取成员,并且总是会返回method,因为这就是实例或类字典中存在的内容。 -
是的,我会记住的:)
-
@ChristianDean 在投票结束之前阅读了该问题,这与您找到的问题不重复..