當模組中遇到屬性查找失敗時,希望建立關聯類別的實例與模組並調用與失敗屬性同名的方法。然而,由於 xxx 方法的限制以及修改模組屬性的限制,Python 並不直接支援這一點。
遇到的兩個挑戰是:
解決方案
要克服這些限制,解決方法是建立替換類別的包裝器實例並將其儲存在sys.modules 中以取代原始模組。這有效地將所有屬性查找重定向到包裝器實例,從而允許實現類似 getattr__ 的行為。然而,值得注意的是,與直接在模組上使用 __getattr 相比,這種方法可能會導致不同的行為,因為包裝器每次都會建立一個新實例。
Guido van Rossum 的Hack
Guido van Rossum 提出了一種替代方法,利用導入機制的餘量用實例或類別替換sys.modules 中的模組。在此方法中,在模組中定義具有所需功能的類,並將其指派給 sys.modules[__name__] 作為模組的最終行為。這允許在模組本身上實現 getattr 和其他元編程功能。然而,重要的是要確保所有必要的功能都封裝在替換類別中,因為模組的其他元素將在 sys.modules 分配時遺失。
以上是如何在 Python 中為模組實作類似「getattr」的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!