Comment ajouter dynamiquement des propriétés aux classes en Python ?

Mary-Kate Olsen
Libérer: 2024-11-09 06:44:02
original
381 Les gens l'ont consulté

How do you Dynamically Add Properties to Classes in Python?

Ajout dynamique de propriétés en Python

En Python, l'ajout dynamique de propriétés aux classes présente un défi unique. Au départ, on pourrait tenter d'ajouter des propriétés directement aux instances de classe en utilisant setattr. Cependant, cette approche attribue un objet de propriété à l'attribut, annulant ainsi le comportement souhaité.

La solution

Pour ajouter une propriété de manière dynamique, elle doit être ajoutée directement au classe elle-même. Prenons l'exemple suivant :

class Foo(object):
    pass

foo = Foo()
foo.a = 3

# Dynamically add property 'b' to class
Foo.b = property(lambda self: self.a + 1)

print(foo.b)  # Outputs 4
Copier après la connexion

Comprendre les descripteurs

Les propriétés en Python sont implémentées à l'aide de descripteurs. Les descripteurs sont des objets qui gèrent l'accès aux attributs sur une classe spécifique. Ils possèdent des méthodes get__, __set__ ou __delete qui définissent la manière dont l'attribut est accédé, défini ou supprimé.

Python appelle Foo.b.__get__(foo, Foo) lors de l'accès à foo. b, et la valeur de retour devient la valeur de l'attribut. Dans ce cas, le descripteur de propriété appelle sa méthode fget, en transmettant la valeur de l'instance.

Objets de méthode en tant que descripteurs

Les méthodes elles-mêmes sont un autre type de descripteur. Leur méthode get ajoute l'instance appelante comme premier argument, la liant efficacement à l'instance.

En résumé, l'ajout dynamique de propriété en Python nécessite d'attacher la propriété à la classe elle-même, en tirant parti de Python système de descripteurs. Cela permet une gestion personnalisée des attributs par classe.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal