在python包中使用另一个文件中的类,在_uinit__;()中发生冲突

在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

我正在编写一个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__(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