2009-12-06 4 views
21

Если у меня есть класс Python и вы хотите вызвать функцию из него в зависимости от переменной, как бы это сделать? Я предположил, что следующий может это сделать:Вызов метода из строки

class CallMe: # Class 

    def App(): # Method one 

     ... 

    def Foo(): # Method two 

     ... 

variable = "App" # Method to call 

CallMe.variable() # Calling App() 

Но это не могло. Любой другой способ сделать это?

+1

Как вы определяете, какое значение нужно разместить в 'variable'? –

+0

Я бы использовал аргумент, переданный в файл. :) – Sirupsen

ответ

57

Вы можете сделать это:

getattr(CallMe, variable)() 

getattr является встроенным методом, он возвращает значение именованных приписывал объект. Значение в этом случае является объектом метода, с которым вы можете позвонить()

+1

Не могли бы вы рассказать мне, что мне делать, если у меня есть строка, значение которой «CallMe»? – Y2H

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() 
1

Вы можете использовать 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" 
1

Ваш класс был объявлен как «класс старого стиля». Я рекомендую вам сделать все ваши классы «классами нового стиля».

Разница между старым и новым заключается в том, что классы нового стиля могут использовать наследование, которое вам может не понадобиться сразу. Но это хорошая привычка.

Вот что вам нужно сделать, чтобы создать класс нового стиля: вы используете синтаксис Python, чтобы сказать, что он наследует «объект». Вы делаете это, помещая круглые скобки после имени класса и помещая в круглые скобки имя объект. Как так:

class CallMe(object): # Class 

    def App(): # Method one 

     ... 

    def Foo(): # Method two 

     ... 

Как я уже говорил, вы, возможно, не нужно использовать наследование сразу, но это хорошая привычка. На StackOverflow есть несколько вопросов: «Я пытаюсь сделать X, и он не работает», и выясняется, что человек закодировал класс старого стиля.