objects learn functions español classes and python class python-3.x python-internals

learn - python classes functions



¿Por qué es una clase__dict__ un proxy de mapeo? (2)

Esto ayuda al intérprete a asegurar que las claves para los atributos y métodos a nivel de clase solo pueden ser cadenas.

En otros lugares, Python es un "lenguaje de consentimiento para adultos", lo que significa que los dictados de los objetos están expuestos y mutables por el usuario. Sin embargo, en el caso de los atributos y métodos a nivel de clase para las clases, si podemos garantizar que las claves son cadenas, podemos simplificar y acelerar el código de caso común para la búsqueda de atributos y métodos a nivel de clase. En particular, la lógica de búsqueda __mro__ para clases de estilo nuevo se simplifica y acelera al suponer que las claves de clase dict son cadenas.

Me pregunto por qué una clase __dict__ es un mappingproxy , pero una instancia __dict__ es simplemente un dict simple

>>> class A: ... pass >>> a = A() >>> type(a.__dict__) <class ''dict''> >>> type(A.__dict__) <class ''mappingproxy''>


Un mappingproxy es simplemente un dict sin método __setattr__ .

Puede consultar y consultar este código.

from types import MappingProxyType d={''key'': "value"} m = MappingProxyType(d) print(type(m)) # <class ''mappingproxy''> m[''key'']=''new'' #TypeError: ''mappingproxy'' object does not support item assignment

mappingproxy es desde Python 3.3. El siguiente código muestra los tipos de dict:

class C:pass ci=C() print(type(C.__dict__)) #<class ''mappingproxy''> print(type(ci.__dict__)) #<class ''dict''>