[英]What's the purpose of dictproxy?
類型的__dict__
是只讀的dictproxy
對象。 我想知道它的目的是什么。 它僅用於“不允許修改內置類型”嗎? 我找到了一種可以繞過這個的方法。 我知道修改內置類型不是一個好主意。 但我正在嘗試即時修改 Cython 的cdef class
。
我想知道以這種方式修改cdef class
的__dict__
有什么危險嗎?
這是代碼:
import gc
gc.get_referents(float.__dict__)[0]["square"] = lambda self: self*self
(3.14).square()
dictproxy
(在類中找到)的目的是允許在 Python 解釋器中進行優化並確保其穩定性。 有關優化要求的詳細信息,請參閱下面的 MartijnPieters 評論,這顯然依賴於class.__dict__
的鍵始終是字符串。
dictproxy
似乎也在防止解釋器中的某些不穩定性方面發揮作用。 有關此類不穩定性的更多信息,請參閱 python.org 上討論的錯誤報告和錯誤修復,標題為 Bypassing __dict__ readonlyness 。 如果您不使用某種代理機制,則可以寫入__dict__
。 如果可以寫,可以刪除。 在錯誤報告中,他們討論了一些可能刪除__dict__
並導致解釋器崩潰的場景。
請注意,這與您可以直接或使用__setitem__()
分配的類實例形成對比:
instance.__dict__['x'] = 1
此外,實例__dict__
可以被刪除。 如果它被刪除,那么它會在嘗試屬性分配時自動重新創建:
del instance.__dict__ instance.a = 1 instance.__dict__
所以總而言之, dictproxy
允許類更優化地運行,並使解釋器更穩定。
__dict__
是一個包含類屬性的命名空間對象。
只要您不修改__dict__
本身,修改 dict 對象應該沒有問題:
例子:
//good
MyClass.x = 1
//bad
MyClass.__dict__['x'] = 1
//good
m = MyClass()
m.x = 1
//also good
m.__dict__['x'] = 1
Python 文檔 [ LINK ]: Attribute assignment updates the module's namespace dictionary, eg, mx = 1 is equivalent to m.__dict__["x"] = 1.
所以修改dict的對象應該沒有問題。
此外:
因為我們可以修改類的屬性,所以類的字典總是可寫的:
__dict__ | The namespace supporting arbitrary function attributes. | Writable
筆記
可能是 CPython 的實現與 Python 略有不同,但正如我從文檔中看到的那樣,它沒有被提及。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.