Je me demande pourquoi une classe __dict__
est un mappingproxy
, mais une instance __dict__
n'est qu'un simple dict
>>> class A:
... pass
>>> a = A()
>>> type(a.__dict__)
<class 'dict'>
>>> type(A.__dict__)
<class 'mappingproxy'>
Cela aide l'interpréteur à garantir que les clés des attributs et des méthodes au niveau de la classe ne peuvent être que des chaînes.
Ailleurs, Python est un "langage pour adultes consentants", ce qui signifie que les dict pour les objets sont exposés et modifiables par l'utilisateur. Cependant, dans le cas des attributs et des méthodes de classe pour les classes, si nous peut garantir que les clés sont des chaînes, nous pouvons simplifier et accélérer le code de cas commun pour la recherche d'attributs et de méthodes au niveau de la classe. En particulier, la logique de recherche __mro__ pour les classes de nouveau style est simplifiée et accélérée en supposant les clés de dict de classe sont des chaînes.
Un mappingproxy est simplement un dict sans __setattr__
méthode.
Vous pouvez vérifier et vous référer à ce code.
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 est depuis Python 3.3. Le code suivant montre les types de dict:
class C:pass
ci=C()
print(type(C.__dict__)) #<class 'mappingproxy'>
print(type(ci.__dict__)) #<class 'dict'>