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

2024-05-14 06:48:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

# 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

也就是说,我想通过发出适当的import语句来设置库的全局命名空间中有哪些类可用


Tags: pycoreimport脚本backendipythonlibrarymyclass
1条回答
网友
1楼 · 发布于 2024-05-14 06:48:13

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

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

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

# 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

相关问题 更多 >

    热门问题