【问题标题】:Call method from string从字符串调用方法
【发布时间】:2009-12-06 14:41:13
【问题描述】:

如果我有一个 Python 类,并且想根据变量从中调用一个函数,我该怎么做?我想象以下可以做到:

class CallMe: # Class

   def App(): # Method one

      ...

   def Foo(): # Method two

      ...

variable = "App" # Method to call

CallMe.variable() # Calling App()

但它不能。还有其他方法吗?

【问题讨论】:

  • 您如何决定在variable 中放置什么值?
  • 我会使用传递给文件的参数。 :)

标签: python oop


【解决方案1】:

你可以这样做:

getattr(CallMe, variable)()

getattr 是一个内置方法,它返回对象的命名属性值。本例中的值是一个方法对象,可以用 () 调用

【讨论】:

  • 如果我有一个值为"CallMe"的字符串,你能告诉我该怎么办吗?
  • 同样的方法适用于模块。如果 CallMe 位于作为 m 导入的模块中,则 getattr(m, 'CallMe') 将返回该类。
【解决方案2】:

您可以使用 getattr,也可以将绑定或未绑定的方法分配给变量。绑定方法绑定到类的特定实例,未绑定方法绑定到类,因此您必须将实例作为第一个参数传入。

例如

class CallMe:
    def App(self):
        print "this is App"

    def Foo(self):
        print "I'm Foo"

obj = CallMe()

# bound method:
var = obj.App
var()         # prints "this is App"

# unbound method:
var = CallMe.Foo
var(obj)      # prints "I'm Foo"

【讨论】:

    【解决方案3】:

    您的课程已被声明为“旧式课程”。我建议您将所有课程都设为“新式课程”。

    新旧的区别在于新样式的类可以使用继承,而您可能不需要马上使用。但这是一个好习惯。

    创建一个新样式类所需要做的就是:使用 Python 语法说它继承自“对象”。您可以通过在类名后面加上括号并将名称 object 放在括号内来实现。像这样:

    class CallMe(object): # Class
    
       def App(): # Method one
    
          ...
    
       def Foo(): # Method two
    
          ...
    

    正如我所说,您可能不需要立即使用继承,但这是一个养成的好习惯。 StackOverflow 上有几个问题,大意是“我正在尝试做 X,但它不起作用”,事实证明这个人编写了一个老式类。

    【讨论】:

      【解决方案4】:

      你的代码看起来不像python,可能你想这样做吗?

      class CallMe:
      
          def App(self): #// Method one
              print "hello"
      
          def Foo(self): #// Method two
              return None
      
          variable = App #// Method to call
      
      CallMe().variable() #// Calling App()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-10
        • 2014-01-03
        相关资源
        最近更新 更多