Python 更改方法名称

Python Changing name of method

使用python 3.6。我正在尝试编写一些代码,允许我在 class 方法上放置一个唯一标识符。

这是一个例子:

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'

我希望能够遍历 class 的方法并且只执行我用装饰器标记的方法。这能做到吗?

您可以使用布尔标志来标记函数。这是我的建议:

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

与其尝试更改您创建的方法的名称,您可以利用函数和方法首先是 class 对象这一事实来将 属性 分配给方法本身。

在下面的代码中,您可以创建一个简单的装饰器,将 属性 TEST 添加到您要测试的方法中。

def test(func):
    func.TEST = True
    return func


class example:
    @test
    def method(self):
        pass

ex = example()
ex.method.TEST
# returns:
True