列出类的方法并动态调用类的方法

时间:2011-05-20 15:26:02

标签: python class methods

是否可以获取类的方法列表,然后在类的实例上调用方法?我遇到过编写类的方法列表的代码,但是我没有找到一个也调用类实例上的方法的例子。

鉴于课程:

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()

5 个答案:

答案 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。