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)

我以前用函数做过类似的事情,不能用方法做到这一点需要我重写大量的代码......

4

4 回答 4

6
instructions = ["shrink","grow","shrink"]
for i in instructions:
     getattr(elephant,i)()
于 2012-10-02T21:33:26.963 回答
3

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

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)
于 2012-10-02T21:36:57.930 回答
1

可以dir用来获取对象的所有属性名,以及getattr获取对象的属性值。您可能还不想调用任何不可调用的属性(例如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()
于 2012-10-02T21:34:50.770 回答
0

可能很天真:

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

陷阱包括ins必须是一个字符串,并且验证ins您真正想要调用的内容和getattr(elephant, ins)可调用的内容可能是明智的。

于 2012-10-02T21:33:35.293 回答