如何在Python中进行类的递归组合



假设,我需要使用lxml-库将以下XML读取到python对象中:

<detaileddescription>
<para>
<parameterlist kind="param">
<parameteritem>
<parameternamelist>
<parametername>parameters</parametername>
</parameternamelist>
<parameterdescription>
<para>- parameters of the distribution</para>
</parameterdescription>
</parameteritem>
</parameterlist>
</para>        
</detaileddescription>

因此,我创建了以下类:

ParaTag.py

from ParameterListTag import ParameterListTag
class ParaTag:
parameterListTag: ParameterListTag
text: str
def __init__(self):
self.parameterListTag = None
self.text = None

参数描述标记.py

from ParaTag import ParaTag

class ParameterDescriptionTag:
text: str
paraTag: ParaTag
def __init__(self):
self.text = None
self.paraTag = None

ParameterListTag.py

from ParameterDescriptionTag import ParameterDescriptionTag

class ParameterListTag:
parameterDescTag: ParameterDescriptionTag
text: str
def __init__(self):
self.parameterDescTag = None
self.text = None

我的目标是通过lxml库读取XML,然后将读取标记映射到相应的类中。

以下是驱动程序:

MainClass.py

from ParaTag import ParaTag
class MainClass:
@classmethod
def main(cls):
para_obj = ParaTag()
print(para_obj)

if __name__ == '__main__':
MainClass.main()

然而,这并不执行:

输出

C:UserspcAppDataLocalMicrosoftWindowsAppspython3.7.exe C:/Users/pc/source/repos/OOP_in_python/MainClass.py
Traceback (most recent call last):
File "C:/Users/pc/source/repos/OOP_in_python/MainClass.py", line 1, in <module>
from ParaTag import ParaTag
File "C:UserspcsourcereposOOP_in_pythonParaTag.py", line 1, in <module>
from ParameterListTag import ParameterListTag
File "C:UserspcsourcereposOOP_in_pythonParameterListTag.py", line 1, in <module>
from ParameterDescriptionTag import ParameterDescriptionTag
File "C:UserspcsourcereposOOP_in_pythonParameterDescriptionTag.py", line 1, in <module>
from ParaTag import ParaTag
ImportError: cannot import name 'ParaTag' from 'ParaTag' (C:UserspcsourcereposOOP_in_pythonParaTag.py)
Process finished with exit code 1

那么,我该如何解决这个问题

我认为您有循环依赖关系。如果我正确地阅读了您的代码,ParaTag引用了ParaListTag,后者引用了ParaDescriptionTag,后者再次引用了ParaTag。

https://www.yawintutor.com/importerror-cannot-import-name/#:~:text=%20python%20ImportError%3A%20无法%20import,已使用%20to%20load%20the%20模块。

这个链接比我能更好地解释为什么允许这样做,但关键段落是

"另一个原因是负载相关性是循环的。如果两个python文件相互引用并试图加载另一个文件,则将建立循环加载依赖关系。这将导致堆内存错误。Python检测并抛出错误ImportError:Can't Import Name">

Mauro Baraldi的链接指出,你需要找到一种不同的方式来构建你的类。

最新更新