Maison >développement back-end >Tutoriel Python >Pourquoi ne puis-je pas modifier les attributs d'une instance d'objet Vanilla en Python ?
Lors de la tentative d'attribuer des attributs à une instance d'objet Vanilla comme o.attr = 'hello', une AttributeError est levée , indiquant que l'objet ne possède pas l'attribut spécifié. Cependant, ce n'est pas un problème pour les classes héritant d'un objet, comme Sub, qui peuvent attribuer des attributs comme s.attr = 'hello'. Pourquoi est-ce le cas nécessite une compréhension de l'infrastructure interne de Python.
Pour prendre en charge l'attribution d'attributs dynamiques, un objet doit avoir un __dict__, qui sert de dictionnaire où les attributs arbitraires peuvent être stockés. Sans __dict__, il n'y a pas de stockage disponible pour les nouveaux attributs.
Une instance d'objet n'a pas de __dict__. En inclure un dans la définition de l'objet entraînerait un problème de dépendance circulaire, car dict hérite également de l'objet. De plus, l'attribution d'un __dict__ à chaque objet introduirait une surcharge de mémoire inutile pour les objets qui ne nécessitent pas d'attribution d'attributs dynamiques.
Lorsqu'une classe est créée et hérite d'un objet , la situation change. La création d'une instance de classe déclenche l'allocation d'un __dict__. Cela permet aux sous-classes d'objet de posséder des capacités d'attribution d'attributs dynamiques, mais avec un coût de mémoire associé à une flexibilité supplémentaire.
Python fournit une optimisation technique, __slots__, pour limiter les attributs pouvant être attribués à un objet. En spécifiant une séquence de noms de chaînes dans l'attribut __slots__, la classe demande à Python de ne pas créer de __dict__ et alloue à la place uniquement les emplacements d'attribut spécifiés. Cette approche réduit la surcharge de mémoire et peut être utile dans les situations où les objets ont un ensemble fixe d'attributs.
En résumé, l'incapacité d'attribuer des attributs aux instances d'objet provient de l'absence de __dict__, ce qui introduirait une surcharge de mémoire. pour les objets sans capacités d’attribution d’attributs dynamiques. Cependant, les instances de classe possèdent un __dict__ et peuvent attribuer dynamiquement des attributs. L'attribut __slots__ fournit une option d'optimisation de la mémoire en limitant l'attribution d'attributs à un ensemble fixe.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!