【问题标题】:Loop through functions in a Class in Python循环遍历 Python 类中的函数
【发布时间】:2022-01-24 12:07:40
【问题描述】:

我有以下简化代码:

class States:
    def __init__(self):
        pass

    def state1(self):
        a = 2*10
        return a

    def state2(self):
        a = 50/10
        return a

class Results:
    def __init__(self):
        pass

    def result(self):
        states = States()
        
        x = []
        
        for i in [state1,state2]:
            state_result = states.i()
            x.append(state_result)
            
        return x

我想遍历“States”类中的每个函数。当然

for i in [state1,state2]

将返回“名称 'state1' 未定义”,但我希望它能说明我试图实现的目标。

【问题讨论】:

  • for i in [States.state1, States.state2]: state_result = i(self)

标签: python class oop


【解决方案1】:

您可以使用dir() 来获取类的函数名称。然后可以使用getattr() 调用该函数。

class States:
    def __init__(self):
        pass

    def state1(self):
        a = 2*10
        return a

    def state2(self):
        a = 50/10
        return a

state = States()
for func in dir(States):
    if func.startswith('__'):
        continue
    print(func)
    print(getattr(state, func)())

会输出

state1
20
state2
5.0

【讨论】:

    【解决方案2】:

    你可以这样做:

    def result(self):
            states = States()
            
            x = []
            
            for i in [states.state1,states.state2]: # changed state1 to states.state1 and so on
                state_result = i()
                x.append(state_result)
                
            return x
    

    【讨论】:

      【解决方案3】:

      我认为你可以使用lambda。在这里,我为你做了一个简单的例子。

      def foo(text):
          print(text)
              
                  
      a = [lambda: foo("hey"), lambda: foo("boo")]
      for i in a:
          i()
      

      结果:

      hey
      boo
      

      在你的情况下,你应该过来:

      for i in [lambda: state1(), lambda:state2()]:
          state_result = i()
          x.append(state_result)
      

      但是如果你问我的意见,重要的是要告诉你通过列表​​调用函数不是一种健康的方式。软件语言通常有很多情况的解决方案;但在这种情况下,我认为你的观点是错误的。不建议通过弄乱内置技术并试图找到一些秘密技巧来工作。

      【讨论】:

        【解决方案4】:

        做到这一点的干净方法是“注册”您的状态方法。像这样的东西:

        class States():
            states = []
            def register_state(cache):
                def inner(fn):
                    cache.append(fn)
                return inner
            
            @register_state(states)
            def state1(self):
                a = 2*10
                return a
                
            @register_state(states)
            def state2(self):
                a = 50/10
                return a
        

        那么你的 Results 类就可以了

        class Results:
            def __init__(self):
                pass
            
            def result(self):
                states = States()
                
                x = []
                
                for i in states.states:
                    state_result = i(states)
                    x.append(state_result)
                    
                return x
        

        【讨论】:

          【解决方案5】:

          你可以通过类的dict获取类States的成员为:

          States.__dict__
          

          这将为您提供类的所有属性和功能:

          {'__module__': '__main__', '__init__': <function States.__init__ at 0x00000183066F0A60>, 'state1': <function States.state1 at 0x00000183066F0AF0>, 'state2': <function States.state2 at 0x000001830 ...
          

          您可以将其过滤到列表理解字典中,以不包括 dunders:

          [funcname for funcname in States.__dict__ if not (str.startswith('__') and str.endswith('__'))]
          

          这将返回一个成员函数列表:

          ['state1', 'state2']
          

          然后创建一个States对象为:

          states = States()
          

          完成整个计算:

          for funcname in [funcname for funcname in States.__dict__ if not (funcname.startswith('__') and funcname.endswith('__'))]:
              x.append(States.__dict__[funcname](states))
          

          更好的是,将其理解为:

          [States.__dict__[funcname](states) for funcname in States.__dict__ if not (funcname.startswith('__') and funcname.endswith('__'))]
          

          应用此方法后您的答案是:[20, 5.0]

          或者获取functionName和returnValues的dict作为理解:

          {funcname: States.__dict__[funcname](states) for funcname in States.__dict__ if not (funcname.startswith('__') and funcname.endswith('__'))}
          

          这会给你一个输出:

          {'state1': 20, 'state2': 5.0}
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-09-23
            • 1970-01-01
            • 1970-01-01
            • 2017-01-18
            • 2019-12-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多