簡體   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