我正在编写一个中等大小(几 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/