我現在使用復合模式構建了幾個專案,其中物件層次結構是從組態檔構建的。我的問題是我喜歡將每個子類保存在一個單獨的檔案中,以允許擴展而不更改基類的檔案或擁有巨大的檔案。每個物件一旦實體化,就會根據其配置中列出的型別實體化一個不同的子類。為此,我考慮包含一個工廠函式,該函式將存在于自己的檔案中,匯入所有可訪問的子類,并包含一個函式,該函式將根據傳遞給它的名稱回傳適當的子類。這樣做的問題是,每個子類模塊,為了使用這個工廠,都必須匯入它。這會產生回圈匯入情況,因為工廠模塊會匯入所有子類,這些子類都將其匯入回來。如何避免這種情況,或者是否有一種更簡潔的方法可以在另一個子類中動態實體化一個子類?
舉個例子——我寫了一個“管道”專案,對我經常需要重復的不同程式的自動化很有用。基本的父類稱為“Block”,繼承自創建符合某個介面的塊(即執行操作的其他專案),從我繼承的那些繼承到實際執行特定操作的塊。一個塊只需要在管道中查看它的后繼者,而不關心這是一個單獨的塊還是整個單獨的管道。為了實作這一點,我希望每個塊根據組態檔中定義的順序實體化其后繼者,該順序沿鏈傳遞。如果我要撰寫一個檔案來匯入所有實作的具體塊并回傳任何一個請求,那么我將無法匯入它以用于任何具體塊的模塊,
uj5u.com熱心網友回復:
你知道,如果你在方法或函式中撰寫你的 import 陳述句,它只會在所有模塊級的類和函式都被定義后才會執行,對吧?您的回圈依賴可以像在基類中撰寫一個“工廠”方法一樣簡單地修復,該方法將包含一條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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/489515.html
