簡體   English   中英

dictproxy的目的是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM