您好我是python的新手,并认为我对我构建的程序结构有疑问。
这是我想到的结构的摘录。
.
└── asd
├── asd.py
├── __init__.py
├── Framework
│ ├── importer.py
│ └── __init__.py
├── Library
│ ├── libraryManager.py
│ └── __init__.py
实际上asd
下还有更多的包。 asd.py
旨在成为'主要'。它实例化其他包中包含的不同类的许多对象,例如它有几个libraryManager对象。导入程序可以导入(不仅仅是)库文件。
我认为我的关键缺陷如下:要使不同包中的类能够访问asd
的每个其他实例,他们会获得对主asd
的引用作为参数。
这些是有问题的文件:
asd.py
:
from asd.Framework.importer import importer
from asd.Library.libraryManager import libraryManager
class asd(object):
def __init__(self):
# instantiate several objects
self.nodeLibMng = libraryManager("DbNodeLibrary.txt")
self.importer = importer(self)
importer.py
:
from asd.asd import asd
class importer(object):
def __init__(self, asdRef : asd):
self.asdRef = asdRef
def importNode (self,item):
# The following line shows why I want this reference construct.
self.asdRef.nodeLibMng.appendItemToLibraryDB(item)
现在,如果我想运行asd.py,我会收到以下错误:
ImportError: No module named 'asd.Framework'; 'asd' is not a package
如果我在importer.py中运行测试代码,我会收到此错误:
ImportError: cannot import name 'asd'
其他主题如ImportError: Cannot import name X表明我有循环依赖导入。
那么如何解决这个问题,但保持行为,每个类都可以与asd
的实例进行通信?
编辑0: 我通过添加
来启动asd.py
或importer.py
if __name__ == '__main__':
asd=asd()
答案 0 :(得分:0)
对于遇到同样问题的人:
我只是放弃了引用的输入类型的规范,并相信自己和其他人给出正确的引用。另外,我在try: except:
块中包含对引用的所有访问。
所以在上面的例子中:
class importer(object):
# compare to the previous def __init__(self, asdRef : asd):
def __init__(self, asdRef):
self.asdRef = asdRef
def importNode (self,item):
# The following line shows why I want this reference construct.
try:
self.asdRef.nodeLibMng.appendItemToLibraryDB(item)
except:
raise