繁体   English   中英

如何通过导入填充全局命名空间?

[英]How to populate global namespace by import?

我编写了一个大致结构如下的库:

# file library/module/core.py
class MyClass:
   backend = DesignatedBackend()

# file library/backends/backend_A.py
class DesignatedBackend:
    who = "I'm backend A"

# file library/backends/backend_B.py
class DesignatedBackend:
    who = "I'm backend B"

然后在 IPython 中,或者在运行脚本时,我希望能够编写:

>>> from library.module.core import MyClass
>>> import library.backends.backend_A # or something 

>>> print(MyClass().backend.who)
I'm backend A

即我想通过发出适当的导入语句来设置库的全局命名空间中可用的类。

因为您的核心文件没有导入任何内容,所以它无法解析DesignatedBackEnd是什么。 即使您可以以某种方式将 DesignatedBackEnd 注入核心的命名空间也为时已晚,因为核心模块在您导入它之前无法存在,并且该导入将失败。

您可以“设计”在核心中有一个工厂方法,因此您导入核心模块,注入命名空间,然后动态创建适当的 class。

但最好的方法是使用组合:

# file library/module/core.py
class MyClass:
     def __init__(self, backend_type):
         self.backend = backend_type()

# file library/backends/backend_A.py
class DesignatedBackend:
    who = "I'm backend A"

# file library/backends/backend_B.py
class DesignatedBackend:
    who = "I'm backend B"

这样你就可以做到:

>>> from library.module.core import MyClass
>>> from library.backends.backend_A import DesignatedBacEnd # or something 

>>> print(MyClass(DesignatedBackEnd).backend.who)
I'm backend A

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM