2009-06-17 3 views
6

Есть ли способ использовать строку для вызова метода класса? Вот пример, который мы надеемся, лучше объяснить (с помощью, как я думаю, что это должно быть):Использование строки как имя переменной

class helloworld(): 
    def world(self): 
     print "Hello World!" 

str = "world" 
hello = helloworld() 

hello.`str`() 

Какой бы выход Hello World!.

Заранее спасибо.

+0

Если выход будет "привет мир" или «Привет Мир!"? – Buddy

ответ

16

Вы можете использовать getattr:

>>> class helloworld: 
...  def world(self): 
...   print("Hello World!") 
... 
>>> m = "world" 
>>> hello = helloworld() 
>>> getattr(hello, m)() 
Hello World! 
  • Обратите внимание, что круглые скобки в class helloworld() как в вашем примере не нужны, в данном случае.
  • И, как SilentGhost указывает, str является неудачным именем переменной.
+4

str - плохой выбор для имени переменной. – SilentGhost

-3

один способ вы можете установить переменные равной функцию так же, как данные

def thing1(): 
    print "stuff" 

def thing2(): 
    print "other stuff" 

avariable = thing1 
avariable() 
avariable = thing2 
avariable() 

И выход you'l получает

stuff 
other stuff 

Тогда вы можете получить более сложными и имеют

somedictionary["world"] = world 
somedictionary["anotherfunction"] = anotherfunction 

и так далее. Если вы хотите автоматически компилировать модули методов в словаре использование директории()

+2

Как вы можете получить результат thing1, вызвав blah? –

2

Предупреждение: EXEC опасная функция использовать, изучать его, прежде чем использовать его

Вы также можете использовать встроенную функцию "Exec":

>>> def foo(): print('foo was called'); 
... 
>>> some_string = 'foo'; 
>>> exec(some_string + '()'); 
foo was called 
>>> 
+3

Это действительно не очень хорошая идея. exec следует избегать, когда это возможно. getattr для этой проблемы. – Stephan202

+2

Не путайте * как * что-то делать, будь то * безопасно * или нет. exec действительно опасная функция для использования. Однако есть способы безопасно использовать его. В этом случае вы можете передать контекстные словари «globals» и «locals» для запуска exec в «песочнице». – AgentLiquid

+1

Я слышал ужасные вещи о exec(), но это сработало отлично. –

-3

Что вы ищете является exec

class helloworld(): 
    def world(self): 
     print "Hello World!" 

str = "world" 
hello = helloworld() 

completeString = "hello.%s()" % str 

exec(completString) 
+1

это просто неправильно – SilentGhost

+0

Я никогда не использовал «exec» раньше, но я думаю, что передумаю ... Up-modding. –

Смежные вопросы