[英]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.