我遇到了一個難題。我想我應該知道如何解決這個問題 - 我對Python非常瞭解和經驗豐富 - 但我無法弄清楚。看起來我正在努力應該通過設計模式來解決這個問題,這個模式是工廠主題的變體,但我無法回想起它。 (在本文末尾,我提出了一個技術解決方案,但看起來似乎不合理)。我希望你發現這個討論本身有意思,但我期待聽到一些解決我的問題的建議。給定類A,B,C和D,我想限制B實例的創建方法爲A,C實例爲B的方法,而D爲C的方法 - 換句話說,實例爲B實例的工廠,B實例C實例的工廠,C實例D實例的工廠。 (我也希望D的每個實例存儲哪個C實例創建它,C的每個實例存儲哪個B實例創建它,每個實例B存儲哪個實例A創建它,但這很容易當它在層次結構中創建下一個類的實例時,每個實例都將自身提供爲__init__
參數。)如何在Python中將一個類的對象創建爲另一個類的實例?
這些是應用程序操作的模型層類。應用程序操作B,C或D的實例沒有問題,它不應該直接創建它們 - 它應該能夠直接創建A實例(並且A甚至可以是單例實例)。有多種驗證,管理,跟蹤,審計等等,這些都可以在創建下一個實例的一個類的方法中實現。
一個示例可能是一個操作系統,它可以創建可創建可創建文件的目錄的文件系統,但應用程序代碼必須遵循該鏈。例如,即使它在Directory中有它的手,它也不應該能夠創建Directory給Directory實例的文件,即使在被要求創建一個文件時這是Directory的實例會做什麼。
我正在尋找一種支持某些實現的設計解決方案,而不是用戶驗證 - 我瞭解後者的無用功能。
到目前爲止,我已經想到的唯一的事情是:
- 僅從情況下,_C()只的B實例開頭的所有類的名稱除A以下劃線
- 訪問_B()和_D()只從_C實例
- 依靠應用層程序員通過尊重該佈置和直接創建只(可能singleton)的A類
模塊級「隱藏」的實例從模塊的__all__
列表中省略該類是不夠的,因爲它隻影響import *
構造 - 另一個模塊仍然可以通過import module
達到該類,然後參考module.class
。 (這一切都隱約讓人聯想到C++的問題,它需要兩個類成爲朋友,因爲他們參與雙向關係:每個類的實例必須能夠引用另一個類的方法,關係的另一面)
可能最符合Python的語義和語用的解決方案是在C中定義D,在B中定義D,在A中定義B。這看起來是一種非常醜陋的方式將多個模塊的代碼集成到一個非常大的類中。 (想象一下,如果連鎖店再下降幾個級別。)這是嵌套類的更常見用法的延伸,也許是唯一技術上可行的方法,但我從來沒有見過這種俄羅斯娃娃類結構。
想法?
這將是有益的,如果你能在你從自己的思路和範例的分離單句簡潔制定的問題。 – noumenal
這很可怕,但不是嘗試使類構造函數無法訪問,您可以在構建過程中使用類似於[此處](http://stackoverflow.com/a/9812105/3895264)中描述的技術來檢查調用方法的類。請注意,我會推薦這個! – FujiApple
分離是一個好主意 - 抱歉,我沒有想到它。 –