代码之家  ›  专栏  ›  技术社区  ›  Sirupsen

从字符串调用方法

  •  25
  • Sirupsen  · 技术社区  · 15 年前

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

    class CallMe: # Class
    
       def App(): # Method one
    
          ...
    
       def Foo(): # Method two
    
          ...
    
    variable = "App" # Method to call
    
    CallMe.variable() # Calling App()
    

    但不行。还有别的办法吗?

    4 回复  |  直到 11 年前
        1
  •  67
  •   Nadia Alramli    15 年前

    您可以这样做:

    getattr(CallMe, variable)()
    

    getattr 是一个内置方法,它返回对象的命名属性的值。在这种情况下,该值是可以用()调用的方法对象。

        2
  •  3
  •   YOU    15 年前

    你的代码看起来不像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()
    
        3
  •  1
  •   Dave Kirby    15 年前

    可以使用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"
    
        4
  •  1
  •   steveha    15 年前

    您的类已声明为“旧式类”。我建议你把所有的课程都改成“新型课程”。

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

    创建一个新的样式类需要做的就是:使用python语法来表示它继承自“object”。你可以在类名后面加上括号,然后加上类名 对象 在括号内。像这样:

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

    正如我说的,你可能不需要马上使用继承权,但这是一个好习惯。在stackoverflow中有几个问题会影响到“我正在尝试 X 结果发现这个人编写了一个老式的班级。