【问题标题】:How to pass variables to getattr如何将变量传递给getattr
【发布时间】:2021-01-11 07:40:17
【问题描述】:

我需要按名称调用类方法,并传递任何参数。下面是我尝试做的一个例子:

class C:
    def m(self, s, l=1):
        return "result"
    
    def add(self, op, *args, **kwargs):
        xx = getattr(C, op)(*args, **kwargs)
        print(xx)

ss = C()
ss.add('m', 1, l=5)

这是我得到的错误:

TypeError: m() missing 1 required positional argument: 's'

如何动态地将任何参数传递给我调用的任何方法?

【问题讨论】:

  • getattr(self, op)?或者让它们成为静态的,因为它们不使用 self 。
  • 你的预期输出是什么?

标签: python


【解决方案1】:

您需要使用self 而不是C

class C:
    def m(self, s, l=1):
        return "result"
    
    def add(self, op, *args, **kwargs):
        xx = getattr(self, op)(*args, **kwargs)
        print(xx)

ss = C()
ss.add('m', 1, l=5)

【讨论】:

    【解决方案2】:

    你错过了self。每个没有使用instace.method()语法调用的实例方法,都应该使用class.method(instance)语法调用:

    class C:
        def m(self, s, l=1):
            return "result"
        
        def add(self, op, *args, **kwargs):
            xx = getattr(C, op)(self, *args, **kwargs)
            print(xx)
    
    ss = C()
    ss.add('m', 1, l=5)
    

    另一种方法是使用getattr(instance, op)而不是geattr(class, op)来绑定方法:

    class C:
        def m(self, s, l=1):
            return "result"
        
        def add(self, op, *args, **kwargs):
            xx = getattr(self, op)(*args, **kwargs)
            print(xx)
    
    ss = C()
    ss.add('m', 1, l=5)
    

    有关其工作原理的更多信息:Accessing methods via getattr

    【讨论】:

      【解决方案3】:

      你必须要么

      (a) 使用getattr(self, op)(*args, **kwargs)

      这样你就调用了instance 方法。

      -或-

      (b) 将self 显式传递给C 类的class 方法

      getattr(C, op)(self, *args, **kwargs)
      

      【讨论】:

        【解决方案4】:

        m() 中跳过s 或在getattr 中使用self 而不是C

        class C:
            def m(self, l=1):
                return "result"
        
            def add(self, op, *args, **kwargs):
                xx = getattr(C, op)(*args, **kwargs)
                print(xx)
        
        ss = C()
        ss.add('m', 1, l=5)
        

        或者使用

        class C:
            def m(self,s, l=1):
                return "result"
        
            def add(self, op, *args, **kwargs):
                xx = getattr(self, op)(*args, **kwargs)
                print(xx)
        
        ss = C()
        ss.add('m', 1, l=5)
        

        【讨论】:

          猜你喜欢
          • 2021-05-25
          • 2018-12-28
          • 2011-04-12
          • 2017-01-24
          • 2018-05-17
          • 2012-04-20
          • 2018-03-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多