创建要在Python中执行的方法列表

时间:2012-10-02 21:31:42

标签: python list methods iteration

我真的希望有一些方法可以做到这一点:

如何在python中创建一个方法列表以应用于对象?

给出一些任意的类:

class someClass:
    def __init__(self, s):
        self.size=s
    def shrink(self):
        self.size-=1
    def grow(self):
        self.size+=1
    def invert(self):
        self.size= -self.size

我希望能够像这个列表一样编写一个可迭代的对象:

instructions=[shrink,grow,shrink,shrink,grow,invert]

稍后运行for循环:

elephant=someClass(90)
sizeList=[]
for ins in instructions:
    elephant.ins()
    sizeList.append(elephant.size)

我以前做过类似功能的事情,不能用方法做这件事会要求我重写一些令人生畏的代码......

4 个答案:

答案 0 :(得分:5)

instructions = ["shrink","grow","shrink"]
for i in instructions:
     getattr(elephant,i)()

答案 1 :(得分:2)

作为使用字符串作为指令列表的替代方法,您可以执行以下操作:

instructions = [someClass.shrink, someClass.grow, someClass.shrink,
                someClass.shrink, someClass.grow, someClass.invert]
elephant = someClass(90)
sizeList = []
for ins in instructions:
    ins(elephant)
    sizeList.append(elephant.size)

答案 2 :(得分:1)

您可以使用dir获取对象的所有属性名称,使用getattr获取对象的属性值。您可能还希望不调用任何非callable属性(例如2"foo"):

for m in dir(elephant):
    if not m.startswith('_'):
        f = getattr(elephant, m)
        if callable(f): # Do not try to call non-function properties
            f()

答案 3 :(得分:0)

可能是天真的:

for ins in instructions:
  getattr(elephant, ins)()

问题包括ins必须是一个字符串,并且明智的做法是验证ins是您真正想要调用的内容,getattr(elephant, ins)是否可调用。