我真的希望有一些方法可以做到这一点:
如何在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)
我以前做过类似功能的事情,不能用方法做这件事会要求我重写一些令人生畏的代码......
答案 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)
是否可调用。