python: создание экземпляра из имени переменной - PullRequest
2 голосов
/ 16 июня 2011

*** EDIT2: Извините за неработающий код. Вот рабочий код, который иллюстрирует ту же проблему:

class bead():
    def printmsg(a):
        print('test message')

chain1=bead()
x='chain1'
eval(x + '.printmsg()')

*** EDIT: Спасибо, Гнибблер, за ответ на оригинальный вопрос. Вот лучше сформулированная версия моего вопроса:

class bead():
    def msg():
        print('test message')

x='chain1'
y='bead1'

eval(x + '.' + y + '=bead()')

chain1.bead1.msg()

Выход: 'тестовое сообщение'

Какой лучший способ сделать это?

Оригинальный вопрос:

Сценарий:

class testClass():
    test1='test1 text'

x='testClass'
y='test1'

eval(x + '.' + y)

выход: 'test1 text'

Есть ли лучший способ сделать это?

*** EDIT: getattr () работает для извлечения информации из класса. Спасибо, Гнибблер. Позвольте мне немного изменить вопрос:

что я мог бы использовать вместо:

х = 'chain1' у 'mol1' =

Ответы [ 2 ]

12 голосов
/ 16 июня 2011

Вместо eval() можно сказать

getattr(locals()[x], y)

или

getattr(locals().get(x), y)

Это то, что вы имеете в виду?

1 голос
/ 16 июня 2011

Мне кажется, я понимаю.Что вы, вероятно, хотите, это:

>>> class testClass():
...     test1='test1 text'
... 
>>> getattr(testClass, 'test1')
'test1 text'

Тем не менее, это не создает экземпляр.Обращаясь к ответу gnibbler, здесь вы делаете экземпляр:

>>> locals().get(x)()
<__main__.testClass instance at 0xb73b056c>
>>> getattr(locals().get(x)(), y)
'test1 text'

Для вашего последнего редактирования:

>>> class bead():
...     def printmsg(a):
...         print('test message')
... 
>>> chain1=bead()
>>> x='chain1'
>>> eval(x + '.printmsg()')
test message
>>> getattr(locals()[x], 'printmsg')()
test message
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...