Подтвердить что ты не робот

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

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

class CallMe: # Class

   def App(): # Method one

      ...

   def Foo(): # Method two

      ...

variable = "App" # Method to call

CallMe.variable() # Calling App()

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

4b9b3361

Ответ 1

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

getattr(CallMe, variable)()

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

Ответ 2

Ваш код не похож на 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

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

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

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

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

class CallMe(object): # Class

   def App(): # Method one

      ...

   def Foo(): # Method two

      ...

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