为什么 Python 中的这种非循环继承会触发导入错误?
Why does this non-circular inheritance in Python trigger an import error?
编辑: 结果证明继承是循环的。继续阅读!
我正在使用 Python 3.6。我试图生成一个最小的代码示例来调试我在代码项目中遇到的导入错误,该错误是由我设置继承的方式引起的。我怀疑我做错了什么,但我不明白我违反了什么编码原则。
文件结构如下所示:
temp
|-- __init__.py
|-- superclass_file.py
|-- subclass_file.py
|-- tests
|-- __init__.py
|-- test_subclass_file.py
这些是 Python 脚本的内容:
# temp/__init__.py
from .subclass_file import *
from .superclass_file import *
# temp/superclass_file.py
class Parent:
def __init__(self):
print('I exist.')
# temp/subclass_file.py
from temp import Parent
class Child(Parent):
def __init__(self):
super().__init__()
print('And I exist because of it.')
def print_something(self):
print('Yes, I\'m here.')
if __name__ == '__main__':
Child()
# temp/tests/__init__.py
from .test_subclass_file import *
# temp/tests/test_subclass_file.py
from unittest import TestCase
from temp import Child
class TestChild(TestCase):
def check_inheritance(self):
c = Child()
c.print_something()
当我 运行 check_inheritance()
时,它失败并抛出此错误:
/usr/local/bin/python3.6 ~/temp/subclass_file.py
Traceback (most recent call last):
File "~/temp/subclass_file.py", line 1, in <module>
from temp import Parent
File "~/temp/__init__.py", line 1, in <module>
from .subclass_file import *
File "~/temp/subclass_file.py", line 1, in <module>
from temp import Parent
ImportError: cannot import name 'Parent'
当我 运行 subclass_file.py
中的 main()
方法时,我得到了类似的错误。
但是,当我将 subclass_file.py
中 Parent
的导入从 from temp import Parent
更改为 from temp.superclass_file import Parent
时,错误完全消失.
为什么会这样?在继承的情况下,为什么我不能使用我在其他任何地方使用的相同导入签名——from temp import Parent
?我是否错误地配置了 __init__.py
文件?
现在您正在 superclass_file.py
之前导入 subclass_file.py
。
所以当你尝试做from temp import Parent
的时候,因为subclass_file.py
是之前导入的,所以它不知道Parent
是什么。此外,您可能会造成循环导入问题。
最好的方法应该是使用from temp.superclass_file import Parent
如果你真的想要/需要使用其他方式,那么你必须在 subclass_file.py
之前导入 superclass_file.py
编辑: 结果证明继承是循环的。继续阅读!
我正在使用 Python 3.6。我试图生成一个最小的代码示例来调试我在代码项目中遇到的导入错误,该错误是由我设置继承的方式引起的。我怀疑我做错了什么,但我不明白我违反了什么编码原则。
文件结构如下所示:
temp
|-- __init__.py
|-- superclass_file.py
|-- subclass_file.py
|-- tests
|-- __init__.py
|-- test_subclass_file.py
这些是 Python 脚本的内容:
# temp/__init__.py
from .subclass_file import *
from .superclass_file import *
# temp/superclass_file.py
class Parent:
def __init__(self):
print('I exist.')
# temp/subclass_file.py
from temp import Parent
class Child(Parent):
def __init__(self):
super().__init__()
print('And I exist because of it.')
def print_something(self):
print('Yes, I\'m here.')
if __name__ == '__main__':
Child()
# temp/tests/__init__.py
from .test_subclass_file import *
# temp/tests/test_subclass_file.py
from unittest import TestCase
from temp import Child
class TestChild(TestCase):
def check_inheritance(self):
c = Child()
c.print_something()
当我 运行 check_inheritance()
时,它失败并抛出此错误:
/usr/local/bin/python3.6 ~/temp/subclass_file.py
Traceback (most recent call last):
File "~/temp/subclass_file.py", line 1, in <module>
from temp import Parent
File "~/temp/__init__.py", line 1, in <module>
from .subclass_file import *
File "~/temp/subclass_file.py", line 1, in <module>
from temp import Parent
ImportError: cannot import name 'Parent'
当我 运行 subclass_file.py
中的 main()
方法时,我得到了类似的错误。
但是,当我将 subclass_file.py
中 Parent
的导入从 from temp import Parent
更改为 from temp.superclass_file import Parent
时,错误完全消失.
为什么会这样?在继承的情况下,为什么我不能使用我在其他任何地方使用的相同导入签名——from temp import Parent
?我是否错误地配置了 __init__.py
文件?
现在您正在 superclass_file.py
之前导入 subclass_file.py
。
所以当你尝试做from temp import Parent
的时候,因为subclass_file.py
是之前导入的,所以它不知道Parent
是什么。此外,您可能会造成循环导入问题。
最好的方法应该是使用from temp.superclass_file import Parent
如果你真的想要/需要使用其他方式,那么你必须在 subclass_file.py
superclass_file.py