避免在具有不可變和可變類的Python 中進行循環導入
循環導入通常被認為是糟糕的代碼設計的症狀。然而,在某些情況下,類別之間的循環依賴可能是必要的。為了避免在這種情況下出現導入錯誤,必須仔細管理導入語句和循環引用的位置。
範例場景
考慮兩個類,A 和 B,其中 A 具有可變屬性(列表),B 具有不可變屬性(元組)。每個類別都需要一個方法,該方法會取得另一個類別的實例並傳回自身的實例,從而相應地轉換屬性。
解
有幾種方法可以避免這種情況下的循環導入:
絕對導入:
在a.py和b.py中,使用絕對導入來確保模組可以直接相互導入:
# a.py from package import b # b.py from package import a
延遲導入:
延遲導入其他類,直到函數中實際需要它:
# a.py def convert_to_list(b_obj): from package import b return a.A(list(b_obj.immutable_attr)) # b.py def convert_to_tuple(a_obj): from package import a return b.B(tuple(a_obj.mutable_attr))
中級模組:
建立一個導入a 和b 的中間模組。然後a和b都可以導入該模組,以避免循環導入:
# package/common.py import a import b
在a.py和b.py中,導入中間模組:
# a.py from package import common # b.py from package import common
避免類別定義中的循環引用:
應避免類別定義中的循環引用。相反,請考慮建立一個工廠函數,該函數將類別的屬性作為參數並傳回對應類別的實例:
# a.py def create_a(list_attr): return A(list(list_attr)) # b.py def create_b(tuple_attr): return B(tuple(tuple_attr))
以上是如何使用不可變和可變類別處理 Python 中的循環導入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!