Вызов метода из строки - PullRequest
       11

Вызов метода из строки

29 голосов
/ 06 декабря 2009

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

class CallMe: # Class

   def App(): # Method one

      ...

   def Foo(): # Method two

      ...

variable = "App" # Method to call

CallMe.variable() # Calling App()

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

Ответы [ 4 ]

71 голосов
/ 06 декабря 2009

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

getattr(CallMe, variable)()

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

3 голосов
/ 06 декабря 2009

Ваш код не похож на 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 голосов
/ 06 декабря 2009

Вы можете использовать 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 голос
/ 06 декабря 2009

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

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

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

class CallMe(object): # Class

   def App(): # Method one

      ...

   def Foo(): # Method two

      ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...