четверг, 10 апреля 2008 г.

Python: создание объекта по имени класса

Столкнулся с тем, что оказывается, я никогда этого не делал, а нужно. Например:


IDLE 1.2.1 ==== No Subprocess ====
>>> class stub(object):
def hi(self):
print "Hi !"

>>> a = stub()
>>> a.hi()
Hi !
>>> a
<__main__.stub>
>>> str = u'stub'
>>> str
u'stub'
>>> b = str()
Traceback (most recent call last):
File "", line 1, in
b = str()
TypeError: 'unicode' object is not callable

Не работает - по имени не создаёт класс !
Порылся, нашёл такое. То есть, через globals():

>>> b = globals()[str]()
>>> b
<__main__.stub>
Потом решил поискать на русском (на английском ничего вразумительного на эту тему найти не удалось, далеко запрятано), и, как всегда, оказалось, что наши программисты самые программистые программисты в мире ! :-) No joke !
Итак, здесь тема сами знаете чего раскрыта!.

В данном случае (в idle) сработает и locals():

>>> c = locals()[str]()
>>> c
<__main__.stub>
По вышеуказанному линку на форуме также указано, как создать объект, если известно имя его класса и модуля:

>>> module_name = 'pprint'
>>> class_name = 'PrettyPrinter'
>>> imported_module_object = __import__(module_name)
>>> kls = getattr(imported_module_object, class_name)
>>> pp = kls()
>>> pp.__class__.__name__
'PrettyPrinter'
>>> repr(pp)
pprint.prettyprinter

Вообще, Портал Python-программистов читать очень рекомендую - хороший сайт.

1 комментарий:

  1. Большое спасибо.Нашла здесь нужную мне информацию про создание класса по его имени.

    ОтветитьУдалить