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