在python包中使用另一个文件中的类,在_uinit__;()中发生冲突
我正在编写一个python包(python 3.6),具有以下目录结构:在python包中使用另一个文件中的类,在_uinit__;()中发生冲突,python,python-3.x,import,package,Python,Python 3.x,Import,Package,我正在编写一个python包(python 3.6),具有以下目录结构: package/ | __init__.py | fileA.py | fileB.py | tests/ | | __init__.py | | test_classA.py | | test_classB.py 安装程序 我的文件包含以下内容: # package/fileA.py from package import ClassB def ClassA: def __init__(s
package/
| __init__.py
| fileA.py
| fileB.py
| tests/
| | __init__.py
| | test_classA.py
| | test_classB.py
安装程序
我的文件包含以下内容:
# package/fileA.py
from package import ClassB
def ClassA:
def __init__(self):
self.my_ClassB = ClassB()
-
-
循环导入
当我运行python test_classB.py
时,我得到以下回溯错误,显示我有循环导入语句,这是python不允许的。注意-软件包不是字面上的软件包
,我已经编辑了回溯以匹配上面的玩具示例
Traceback (most recent call last):
File "package/tests/test_classB.py", line 2, in <module>
from package import ClassB
File "/anaconda/lib/python3.5/site-packages/package/__init__.py", line 2, in <module>
from .fileA import ClassA
File "/anaconda/lib/python3.5/site-packages/package/merparse.py", line 2, in <module>
from package import ClassB
ImportError: cannot import name 'ClassB'
…我更改了包/fileA.py的导入方法:
# package/fileA.py
from package.fileB import ClassB
def ClassA:
def __init__(self):
self.my_ClassB = ClassB()
<代码>包/测试/test_classB.py
运行正常
我的问题
我的问题是:如何在文件中保留“一个文件:一个类”结构,并从package import ClassA使用导入,而不必从package.fileA import ClassA使用导入
在我的包中,我想从其他文件导入类,但不知道如何绕过循环导入
编辑:解决方案
感谢下面的@mirandak和@martin kalcok的帮助
我必须编辑的唯一文件是fileA.py
,以便在import语句中不引用包名
# package/fileA.py
from .fileB import ClassB
def ClassA:
def __init__(self):
self.my_ClassB = ClassB()
package/\uuuuu init\uuuuuuuupy
文件仍然包含import语句,以防将来我想从其他脚本导入包,而这些脚本与包没有耦合
# package/__init__.py
from .fileA import ClassA
from .fileB import ClassB
问题在于包/fileA.py
。它既是包
的一部分,又在导入时调用包
的初始化.py
文件-创建循环依赖关系
你能把fileA.py
改成这样吗
# package/fileA.py
from .fileB import ClassB
def ClassA:
def __init__(self):
self.my_ClassB = ClassB()
问题在于包/fileA.py
。它既是包
的一部分,又在导入时调用包
的初始化.py
文件-创建循环依赖关系
你能把fileA.py
改成这样吗
# package/fileA.py
from .fileB import ClassB
def ClassA:
def __init__(self):
self.my_ClassB = ClassB()
首先,将您的软件包重命名为文学“软件包”确实会混淆整个情况,但我的看法是:D.
我不认为您正在处理循环依赖,python只是声明它不能从package
导入classB
,这是因为package
目录中没有名为classB
的文件。将导入语句更改为
之所以有效,是因为有目录包
,其中包含文件fileB
,其中包含对象ClassB
回答是否可以使用语句导入类的问题
来自包导入类B
您不能,除非您的包
是文件,classB
是此文件中的对象。然而,我看不出这个不同的导入语句将如何成为dealbraker
旁注:您的对象ClassB
和ClassA
不是类,而是函数。Python使用关键字class
创建类和def
定义函数。
旁注2:您确定您的\uuuuu init\uuuuuu.py
文件需要保存任何代码吗?
个人注意事项:我知道保持1个文件/1个类结构是个人喜好的问题,python中不需要这样做,我自己发现将多个相关类和函数分组到一个文件中会舒服得多首先,将包重命名为文学“包”确实会混淆整个情况,但我的看法是:D.
我不认为您正在处理循环依赖,python只是声明它不能从package
导入classB
,这是因为package
目录中没有名为classB
的文件。将导入语句更改为
之所以有效,是因为有目录包
,其中包含文件fileB
,其中包含对象ClassB
回答是否可以使用语句导入类的问题
来自包导入类B
您不能,除非您的包
是文件,classB
是此文件中的对象。然而,我看不出这个不同的导入语句将如何成为dealbraker
旁注:您的对象ClassB
和ClassA
不是类,而是函数。Python使用关键字class
创建类和def
定义函数。
旁注2:您确定您的\uuuuu init\uuuuuu.py
文件需要保存任何代码吗?
个人说明:我知道保持1个文件/1个类结构是个人偏好的问题,python中不需要它,我自己发现将多个相关的类和函数分组到一个文件中要舒服得多。包中的classB
来自from.fileB import classB
行。大多数模块都可以从包导入类B中执行,但在包的子模块中尝试会创建循环导入。感谢您的回答,我对您的旁注有一些评论:1。你能把我和一些详细解释对象是类而不是类的东西联系起来吗?我不完全确定这是如何在Python中实现的。2.我希望在我的\uuu init\uuuu.py
文件中包含import语句的唯一原因是允许我将来在非包脚本中使用这些类。你觉得这个怎么样?我希望把它们保存在不同的文件中,主要是因为我是个笨蛋,编辑时经常弄坏东西。这样对git来说更容易?嗨,正如@user2357112所指出的,我的答案是错误的。我错过了它,因为我通常不这样使用\uuuu init\uuuuu.py
文件。我会编辑我的
# package/fileA.py
from package.fileB import ClassB
def ClassA:
def __init__(self):
self.my_ClassB = ClassB()
# package/fileA.py
from .fileB import ClassB
def ClassA:
def __init__(self):
self.my_ClassB = ClassB()
# package/__init__.py
from .fileA import ClassA
from .fileB import ClassB
# package/fileA.py
from .fileB import ClassB
def ClassA:
def __init__(self):
self.my_ClassB = ClassB()
from package.fileB import ClassB