繁体   English   中英

在python包中使用另一个文件中的类并在__init __()中发生冲突

[英]Using class from another file in python package and conflicts in __init__()

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

--

# package/fileB.py
def ClassB:
    def __init__(self):
        self.foo = "bar"

--

# package/tests/test_classB.py
from package import ClassB

# <performs some unit tests here>

--

# package/tests/test_classA.py
from package import ClassA

# <performs some unit tests here>

--

# package/__init__.py
from .fileA import ClassA
from .fileB import ClassB

循环进口

当我运行python test_classB.py ,出现以下回溯错误,表明我具有循环导入语句,这是python不允许的。 注意-该包实际上不是package ,我已经编辑了Traceback以匹配上面的玩具示例。

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'

更正错误

但是,当我删除package/__init__.py文件中的package/__init__.py

# package/__init__.py
from .fileA import ClassA
from .fileB import ClassB

...然后更改package/fileA.py的导入方法:

# package/fileA.py
from package.fileB import ClassB

def ClassA:
    def __init__(self):
        self.my_ClassB = ClassB()

... package/tests/test_classB.py正确运行。

我的问题

我的问题是:如何保存一个文件:文件中的一个类结构,然后from package import ClassA导入,而不必from 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/__init__.py文件仍然包含import语句,以防将来我不想从其他脚本中导入该脚本时从其他脚本中导入该软件包。

# package/__init__.py
from .fileA import ClassA
from .fileB import ClassB

问题出在package/fileA.py 这两个部分package并调用__init__.py的文件package ,因为它的进口-创建一个循环依赖。

您可以将fileA.py更改为以下形式吗?

# package/fileA.py
from .fileB import ClassB

def ClassA:
    def __init__(self):
        self.my_ClassB = ClassB()

首先,将您的程序包重命名为文学“程序包”确实使整个情况感到困惑,但这是我的观点:D。
我不认为您正在处理循环依赖关系,python只是声明它无法从package导入classB ,这是因为package目录中没有名为classB的文件。 将导入语句更改为

from package.fileB import ClassB

之所以起作用,是因为有一个目录package ,其中包含文件fileB ,其中包含对象ClassB
回答您的问题是否可以使用语句导入类

from package import ClassB

您不能,除非您的package是文件,而classB是此文件中的对象。 但是我不明白这个不同的导入声明将如何成为交易经纪人
注意 :您的对象ClassBClassA不是类,而是函数。 Python使用关键字class创建类,并使用def定义函数。
旁注2 :您确定__init__.py文件根本不需要保留任何代码吗?
个人说明 :我知道保留1 File / 1 Class结构是个人喜好问题,在python中不是必需的,我自己发现将多个相关的类和函数组合到一个文件中会更舒适

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM