web-dev-qa-db-fra.com

Pourquoi une classe __dict__ est-elle un proxy de mappage?

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'>
55
José Luis

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.

63
Raymond Hettinger

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