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''>