如何创建一堆类型并使它们可用于从其他模块导入?

时间:2018-08-04 23:00:23

标签: python reflection

我试图使用type(name, bases, attributes)创建一系列类型,而无需将这些类型显式分配给变量,然后使它们可用于从其他类中导入。

到目前为止,我有这样的事情

src/
  __init__.py
  a/
    __init__.py
    a_module.py
  b/
    __init__.py
    b_module.py

src/a/__init__.py中,我有

import inspect
import sys

for c in inspect.getmembers(sys.modules['src.a.a_module'], inspect.isclass):
    type(f'{c.__name__}New, (object,), {})

然后,我想像上面的src/b/b_module.py一样导入类型

from src.a import AClassNew

a = AClassNew()

但这当然是ImportError: cannot import name AClassNew`。

我知道我可以放

AClassNew = type('AClassNew', (object,), {})

src/a/__init__.py中,一切都会起作用,但是我想对src/a/a_module.py中定义的任何类都这样做,而无需明确定义它们。

有没有办法使这个(或类似的东西)起作用?

1 个答案:

答案 0 :(得分:0)

我只是通过更新globals()中的src/a/__init__.py来完成这项工作的。

for c in inspect.getmembers(sys.modules['src.a.a_module'], inspect.isclass):
    new_class_name = f'{c.__name__}New'
    new_class = type(new_class_name, (object,), {})
    globals[new_class_name] = new_class

这会将具有正确名称的类型添加到该模块的类中,并使其可从其他模块导入。