[英]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
是此文件中的对象。 但是我不明白这个不同的导入声明将如何成为交易经纪人
注意 :您的对象ClassB
和ClassA
不是类,而是函数。 Python使用关键字class
创建类,并使用def
定义函数。
旁注2 :您确定__init__.py
文件根本不需要保留任何代码吗?
个人说明 :我知道保留1 File / 1 Class结构是个人喜好问题,在python中不是必需的,我自己发现将多个相关的类和函数组合到一个文件中会更舒适
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.