Python更改方法

时间:2017-08-29 11:34:31

标签: python decorator inspect

使用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'

我希望能够遍历类的方法,只执行我用装饰器标记的方法。可以这样做吗?

2 个答案:

答案 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']