這是一個非常簡單的設置:class A(object): x = 1class B(object): x = 2class C(object): x = 3class B(B): x = 4class C(object): x = 5print A.x, B.x, C.x輸出預期:1, 4, 5是否有可能檢測到 B 已被“重新定義”但 C 已被“替換”?是在創建階段還是隨后通過檢查對象?這些類被用作配置對象,上面有一個加載器類,它導入模塊,然后自省以找到類及其屬性,然后應用程序將它們用于實例命名參數。例如class tcp_port(number): minimum = 1024 maximum = 2048實際上,python 只是用作一種方便的腳本語言來定義主應用程序中的參數。這些文件可供最危險的人編輯: 客戶 因此,要求能夠在運行時檢測類是否(意外地)重用了已定義的名稱,但要安全地通過偶爾的情況其中一個類被重新定義,然后調整或添加一些屬性:class tcp_port(tcp_port): maximum = 4096所以......我希望有一些運行時健全性檢查程序,而不是類似 lint 的解決方案。此外,這需要在定義類而不是實例化時發生。...是否有全局函數被調用來創建一個類(或任何其他對象)?有點像有__new__但在全球范圍內?
2 回答

手掌心
TA貢獻1942條經驗 獲得超3個贊
如果該類是就地重新定義的,它將在 MRO 中保留其自身的舊版本:
>>> [x for x in A.mro() if x.__name__ == A.__name__]
[__main__.A]
>>> [x for x in B.mro() if x.__name__ == B.__name__]
[__main__.B, __main__.B]
>>> [x for x in C.mro() if x.__name__ == C.__name__]
[__main__.C]
所以你可以檢測到這種情況:
def has_redefinition_inplace(classobj):
types = [x for x in classobj.mro() if x.__name__ == classobj.__name__]
return len(types) > 1
這不會是 100% 可靠的,因為可能存在從不同模塊進入 MRO 的合法沖突類名稱。
添加回答
舉報
0/150
提交
取消