【问题标题】:How can I do recursive composition of classes in Python?如何在 Python 中进行类的递归组合?
【发布时间】:2021-04-14 23:57:14
【问题描述】:

假设,我需要使用lxml-library将以下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

ParameterDescriptionTag.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:\Users\pc\AppData\Local\Microsoft\WindowsApps\python3.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:\Users\pc\source\repos\OOP_in_python\ParaTag.py", line 1, in <module>
    from ParameterListTag import ParameterListTag
  File "C:\Users\pc\source\repos\OOP_in_python\ParameterListTag.py", line 1, in <module>
    from ParameterDescriptionTag import ParameterDescriptionTag
  File "C:\Users\pc\source\repos\OOP_in_python\ParameterDescriptionTag.py", line 1, in <module>
    from ParaTag import ParaTag
ImportError: cannot import name 'ParaTag' from 'ParaTag' (C:\Users\pc\source\repos\OOP_in_python\ParaTag.py)

Process finished with exit code 1

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

【问题讨论】:

  • 也许thisthis 的帖子可能有用。

标签: python xml deserialization


【解决方案1】:

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

https://www.yawintutor.com/importerror-cannot-import-name/#:~:text=The%20python%20ImportError%3A%20cannot%20import,used%20to%20load%20the%20module.

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

"另一个原因是加载依赖是循环的。如果两个python文件相互引用并尝试加载另一个文件,那么循环加载依赖就会建立,这会导致堆内存错误。Python检测并抛出错误 ImportError: Can't Import Name。"

Mauro Baraldi 的链接指出的是,您需要找到一种不同的方式来组织您的课程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多