带有移动导入错误的 Python 类继承

Posted

技术标签:

【中文标题】带有移动导入错误的 Python 类继承【英文标题】:Python Class Inheritance with a moving import error 【发布时间】:2021-05-16 04:19:48 【问题描述】:

我的第一个问题! :D

当我尝试吃蛋糕并同时吃它时,我似乎遇到了问题。 我已经删除了所有代码,因为我不认为这是问题的一部分。

我有以下目录结构:

master/
    - main.py
    - modules/
        - parent_class.py
        - child_class.py
        - __init__.py

在 parent_class.py 中:

class Parent:
    pass

在 child_class.py 中:

from modules.parent_class import Parent

class Child(Parent)
    pass

if __name__ == "__main__":
    child = Child()
    child.do_stuff()

在 main.py 中:

from modules.child_class import Child

child = Child()

child.do_stuff()

我认为我遇到的问题与我没有正确理解 sys.path 有关。

当我运行 main.py 时没有错误。 但是,当我尝试运行 child_class.py 以进行测试时,出现以下错误...

Traceback (most recent call last):
  File "child_class.py", line 1, in <module>
    from modules.parent_class import Parent
ModuleNotFoundError: No module named 'modules'

当我将 child_class.py 更改为此错误时:

from parent_class import Parent

class Child(Parent)
    pass

if __name__ == "__main__":
    child = Child()
    child.do_stuff()

但是现在当我运行 main.py 时,我得到了这个错误:

Traceback (most recent call last):
  File "c.../main.py", line 1, in <module>
    from modules.child_class import Child
  File "...\child_class.py", line 1, in <module>
    from parent_class import Parent
ModuleNotFoundError: No module named 'parent_class'

如果每次都必须更改导入行,如何进行单元测试? 预先感谢您的良好解释。 (我已经阅读了很多关于导入、包和模块的文档,观看了关于这个主题的 10 个不同的视频,但仍然不确定为什么或如何使它正常工作。)(我只是说我试图找到答案,但是我现在已经筋疲力尽了,需要一个解决方案才能真正发疯!)谢谢,谢谢,谢谢

【问题讨论】:

这能回答你的问题吗? Import a module from both within same package and from outside the package in Python 3 是的,这是我后来通过另一个来源发现的。我忘了在哪里。这是一个真正的痛苦弄清楚。我将在下面为我的问题写一个更好的答案。不过感谢您的帮助! 【参考方案1】:

在有人告诉我更好的方法之前,我将执行以下操作...

if __name__ == "__main__":
  from parent_class import Parent
else:
  from modules.parent_class import Parent

【讨论】:

【参考方案2】:

TLDR:

使用 -m 标志运行 python 文件。

python -m modules.child_class


此问题是由于误解了 Python Script 程序和 Python Package 程序之间的区别造成的。

如果您将 Python 程序作为脚本运行(直接运行 Python 文件),那么您可以像以前一样直接导入:

from parent_class import Parent

但是,如果您构建的 Python 包旨在导入其他程序(例如库或框架),那么您需要使用相对导入。 (听起来 Unittest 将程序作为一个包运行,但是当您运行程序时,您将其作为脚本运行。)

    from .parent_class import Parent
# or
    from modules.parent_class import Parent

如果您正在制作一个包,则使用 -m 标志运行该程序或导入另一个程序(脚本或另一个包)

python -m 主要

python -m modules.child_class

【讨论】:

谢谢。很好的答案

以上是关于带有移动导入错误的 Python 类继承的主要内容,如果未能解决你的问题,请参考以下文章

Python 类继承 - 均值,错误:未定义均值

Python Qt GUI设计入门模板类的单继承和多继承封装

Python基础之类与模块化

Python面向对象类继承中发生的私有属性访问错误问题

如何强制继承类在 C# 中实现静态方法?

29.Python面向对象类:主要讲初始化方法__init__,垃圾回收,继承&多继承,方法重写,super()函数