2012-10-02 37 views
1
执行

我真的希望有一些方法来做到这一点:创建的方法列表在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) 

我已经做过类似的功能之前,无法做到这一点与方​​法将需要我重写代码的恐吓量...

+2

Duplicate of this:http://stackoverflow.com/questions/7821423/preferable-way-to-dynamically-call-some-objects-method –

+0

只需要注意一点:'invert(self)'应该有自己的身体.size = -self.size',或者不太可能的是'def invert(self,size)'的签名。 – Tadeck

+0

你也可以使用'someClass .__ dict __ [ins](elephant)',否则'getattr()'是好的。 –

回答

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

可能天真地:

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

陷阱包括ins必须是一个字符串,它可能是明智的,同时验证该ins是你真正想打电话,那getattr(elephant, ins)是一个可调用的。

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

if statement - > missing':' – mawueth

+0

@mawueth谢谢,修正。 – phihag

+0

你可能想集成[callable()](http://docs.python.org/library/functions.html#callable) – phant0m

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) 
+0

+1因为不同而仍然正确:) –