从字符串调用方法

时间:2009-12-06 14:41:13

标签: python oop

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

class CallMe: # Class

   def App(): # Method one

      ...

   def Foo(): # Method two

      ...

variable = "App" # Method to call

CallMe.variable() # Calling App()

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

4 个答案:

答案 0 :(得分:71)

你可以这样做:

getattr(CallMe, variable)()

getattr是一个内置方法,它返回object的name属性的值。在这种情况下,值是一个方法对象,您可以使用()

调用

答案 1 :(得分:3)

您的代码看起来不像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()

答案 2 :(得分:2)

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

e.g。

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 :(得分:1)

您的课程已被宣布为“旧式课程”。我建议你把所有课程都变成“新式课程”。

新旧类之间的区别在于新式类可以使用继承,您可能不需要立即继承。但这是一个很好的习惯。

以下是创建新样式类所需要做的全部内容:使用Python语法表示它继承自“object”。您可以通过在类名后面添加括号并将名称​​ object 放在括号中来实现。像这样:

class CallMe(object): # Class

   def App(): # Method one

      ...

   def Foo(): # Method two

      ...

正如我所说,你可能不需要立即使用继承,但这是一个很好的习惯。这里有几个关于StackOverflow的问题,“我正在尝试做 X 并且它不起作用”,结果发现这个人编写了一个旧式的类。