Я могу придумать пару способов сделать это ... В порядке (то, что я считаю) лучшего к худшему, мы имеем:
Во-первых, установка атрибутов на текущем модуле
# The first way I had of grabbing the module:
mod = __import__(__name__, fromlist=['nonempty'])
# From Roger's suggestion:
import sys
mod = sys.modules[__name__]
for name in ['A', 'B', 'C']:
class_ = type(name, (object,), {})
setattr(mod, name, class_)
print A, B, C
во-вторых, установка в текущий глобалам Dict:
for name in ['A', 'B', 'C']:
class_ = type(name, (object,), {})
globals()[name] = class_
print A, B, C
Последний, используя Exec (EWW):
for name in ['A', 'B', 'C']:
class_ = type(name, (object,), {})
exec "%s = class_" % name
print A, B, C
Я тестировал все три эти работы в автономном скрипте (где __name__ == "__main__"
) и как модуль в большем пакете.
EDIT: Что касается обсуждения метода 1 против метода 2 в комментариях, они оба делают одно и то же. Пространство имен модуля определяется в файле dict, хранящемся на модуле (here are the docs). С уровня модуля вы можете получить это через globals()
, а снаружи вы можете получить к нему доступ через атрибуты или атрибут __dict__
модуля.
интерактивная сессия для демонстрации:
Python 2.6.4 (r264:75706, Nov 8 2009, 17:35:59)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> mod = sys.modules[__name__]
>>> mod.__dict__ is globals()
True
Второй способ получит мой +1. Первый - рыбный, а третий - ewww. – u0b34a0f6ae
Почему '__import__' вместо' sys.modules [__ name __] '? – 2009-11-22 15:02:19
@kaizer: Первый - это то, что хочет OP: классы должны быть добавлены к атрибутам модуля (и из модуля, который все еще работает в этом случае), а не в глобальные. Похоже, что '__import__' по-прежнему использует его. Я думаю, что мы все согласны с частью EWW:;) – RedGlyph