【问题标题】:Creating a list of methods to be executed in Python创建要在 Python 中执行的方法列表
【发布时间】:2012-10-02 21:31:42
【问题描述】:

我真的希望有办法做到这一点:

如何在 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)

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

【问题讨论】:

  • 请注意:invert(self) 的正文应该是 self.size= -self.size,或者,不太可能是 def invert(self, size) 的签名。
  • 你也可以使用someClass.__dict__[ins](elephant),否则getattr()就可以了。

标签: python list methods iteration


【解决方案1】:
instructions = ["shrink","grow","shrink"]
for i in instructions:
     getattr(elephant,i)()

【讨论】:

    【解决方案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)
    

    【讨论】:

    • +1,用于表明您可以通过将实例作为参数传递来像调用函数一样调用方法;在这种情况下,大象实例将作为 self 参数传递给方法(函数)
    【解决方案3】:

    您可以使用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()
    

    【讨论】:

    【解决方案4】:

    可能是天真:

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2018-11-12
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多