簡體   English   中英

Python 和循環導入中的工廠和復合設計模式組合

[英]Factory & Composite Design Patterns combo in Python & circular imports

我現在使用復合模式構建了幾個項目,其中對象層次結構是從配置文件構建的。 我的問題是我想將每個子類保存在一個單獨的文件中,以便在不更改基類文件或擁有大文件的情況下允許擴展。 每個 object 一旦被實例化,就會根據其配置中列出的類型實例化一個不同的子類。 為此,我想到了包括一個工廠 function,它將存在於自己的文件中,導入所有可訪問的子類,並包含一個 function,它將根據傳遞給它的名稱返回適當的子類。 這樣做的問題是,為了使用這個工廠,每個子類模塊都必須導入它。 這創建了一個循環導入的情況,因為工廠模塊導入了所有子類,這些子類都將它導入回來。 如何避免這種情況,或者是否有更簡潔的方法在另一個子類中動態實例化子類?

舉個例子——我寫了一個“管道”項目,對我經常需要重復的不同程序的自動化很有用。 基本父類 class 稱為“Block”,它繼承自以創建符合特定接口的塊(即執行操作的其他項目)以及從我繼承的那些創建實際執行特定操作的塊。 一個塊只需要在管道中看到它的后繼者,而不關心這是一個單獨的塊還是一個完整的、獨立的管道。 為了實現這一點,我希望每個塊都根據沿鏈傳遞的配置文件中定義的順序實例化其后繼者。 如果我要編寫一個文件來導入所有已實現的具體塊並返回所請求的任何一個,那么我將無法導入它以用於任何具體塊的模塊,因為它們是按順序導入工廠的可用於實例化本身。

你知道,如果你把你的 import 語句本身寫在一個方法或 function 里面,它只會在所有模塊級類和函數都被定義之后才會執行,對吧? 您的循環依賴性可以像在基 class 中編寫一個“工廠”方法一樣簡單地修復,該方法將包含一個from factory import factory_function語句並調用它。


# basemodel.py  Base file
class Base:
   def factory(self, *args, **kw):
       from factory import factory_function

# baseblock.py Block class hierarchy base file
from basemodel import Base
class Block(Base):
    ...

# blockXX.py Other block classes files:
from baseblock import Block

class SpecializedBlock31(Block):
    ...

# factory.py:

from block import Block
...
from block31 import Block31
...
# (or some dynamic importing using __import__ and looking at the filesystem)

def factory_function(*args, **kw):
    # logic to decide which class to use
    ...
    instance = decided_class(...)
    return instance

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM