Python 命名空间 : How to make unique objects accessible in other modules?

标签 python namespaces pyqt

我正在编写一个中等大小(几 KLOC)的 PyQt 应用程序。为了便于理解,我开始用漂亮的模块编写它,但我在 Python namespace 的规则上陷入困境。在某些情况下,仅将一个类的一个对象实例化为其他代码的资源很重要。

例如:表示 Aspell 的对象附加为子进程,提供 check(word) 方法。另一个示例:该应用程序具有单个 QTextEdit,其他代码需要调用此单个对象的方法,例如“如果 theEditWidget.document().isEmpty()...”

无论我在哪里实例化这样一个对象,它都只能从该模块中的代码引用,而不能从其他模块中引用。所以例如编辑小部件的代码不能调用 Aspell 网关对象,除非 Aspell 对象是在同一模块中创建的。很好,但其他模块也需要它。

this question bunch提供了类,但在我看来,很多人都有完全相同的问题:它是一个独特的对象,只能在创建它的模块中使用。还是我完全错过了这里的船?

好的建议在别处,这似乎是对我的问题的简单回答。我刚刚测试了以下内容:

junk_main.py:

import junk_A
singularResource = junk_A.thing()
import junk_B
junk_B.handle = singularResource
print junk_B.look()

junk_A.py:

class thing():
    def __init__(self):
        self.member = 99

junk_B.py:

def look():
    return handle.member

当我运行 junk_main 时,它会打印 99。因此主代码可以通过分配将名称注入(inject)模块。我正在努力想出这是个坏主意的原因。

最佳答案

您可以使用 . 运算符访问模块中的对象,就像使用函数一样。所以,例如:

# Module a.py
a = 3

>>> import a
>>> print a.a
3

这是一个简单的示例,但您可能想要执行以下操作:

# Module EditWidget.py
theEditWidget = EditWidget()
...

# Another module
import EditWidget

if EditWidget.theEditWidget.document().isEmpty():

或者...

import * from EditWidget

if theEditWidget.document().isEmpty():

如果你选择import * from 路线,你甚至可以define a list named __all__在您的模块中包含您希望模块导出到 * 的所有对象的名称列表(作为字符串)。因此,如果您只想导出 EditWidget,您可以这样做:

# Module EditWidget.py
__all__ = ["theEditWidget"]
theEditWidget = EditWidget()
...

关于Python 命名空间 : How to make unique objects accessible in other modules?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7313215/

相关文章:

python - 从真值表 pandas 中提取数据

php - PHP 5.2 中的命名空间

python - QThread:在Python中线程仍在运行时被销毁

python - PyQt5 - 正确动态调整组件大小和布局组件

python - 以编程方式使用的良好文档标准是什么?

python - paramiko(python)中的超时

python - Azure Functions (python) adal 身份验证超时

python - 什么是 C 相当于 python 的 map()

XML 架构 - elementFormDefault 是不合格的,但使用了命名空间前缀

c# - "Don' t name types the same as namespaces”是否适用于命名空间模块?