使用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'
我希望能够遍历类的方法,只执行我用装饰器标记的方法。可以这样做吗?
答案 0 :(得分:3)
您可以使用函数和方法是第一类对象来为方法本身分配属性,而不是尝试更改已创建方法的名称。
在下面的代码中,您可以创建一个简单的装饰器,将属性TEST
添加到您要测试的方法中。
def test(func):
func.TEST = True
return func
class example:
@test
def method(self):
pass
ex = example()
ex.method.TEST
# returns:
True
答案 1 :(得分:1)
您可以使用布尔标志来标记函数。这是我的建议:
import inspect
def mark(func):
func.flag = True
return func
class C:
@mark
def a(self):
pass
@mark
def b(self):
pass
def c(self):
pass
methods = [m for n, m in inspect.getmembers(C) if hasattr(m, 'flag')]
print([m.__name__ for m in methods]) #=> ['a', 'b']