是否可以获取类的方法列表,然后在类的实例上调用方法?我遇到过编写类的方法列表的代码,但是我没有找到一个也调用类实例上的方法的例子。
鉴于课程:
class Test:
def methodOne(self):
print 'Executed method one'
def methodTwo(self):
print 'Executed method two'
然后列出班级的方法:
import inspect
a = Test()
methodList = [n for n, v in inspect.getmembers(a, inspect.ismethod)]
我想在类的实例上调用methodList
中的每个方法,例如:
for method in methodList:
a.method()
结果相当于:
a.methodOne()
a.methodTwo()
答案 0 :(得分:8)
使用getattr(a,methodname)
访问实际方法,给定字符串名称methodname
:
import inspect
import types
class Test(object):
def methodOne(self):
print('one')
def methodTwo(self):
print('two')
a = Test()
methodList = [n for n, v in inspect.getmembers(a, inspect.ismethod)
if isinstance(v,types.MethodType)]
for methodname in methodList:
func=getattr(a,methodname)
func()
产量
one
two
正如Jochen Ritzel所指出的,如果你对方法名称(字符串)比实际方法(可调用对象)更感兴趣,那么你应该将methodList
的定义更改为
methodList = [v for n, v in inspect.getmembers(a, inspect.ismethod)
if isinstance(v,types.MethodType)]
因此您可以直接调用方法而无需getattr
:
for method in methodList:
method()
答案 1 :(得分:2)
您可以像这样调用动态获得的方法:
for method in methodList:
getattr(a, method)()
但问题是,此代码仅适用于不带任何参数的方法。
答案 2 :(得分:2)
为什么要保留方法的名称而不是方法本身? inspect.getmembers
返回可以直接调用的绑定方法:
for name, method in inspect.getmembers(a, inspect.ismethod):
print "Method", name, "returns", method()
答案 3 :(得分:1)
David Heffernan指出,这只适用于不带任何参数的方法。
for method in methodList:
getattr(a, method)()
答案 4 :(得分:-3)
for method in methodList: eval ("a.%s()" % method)
对于没有参数的方法,除了self。