Maison > Article > développement back-end > Comment ajouter dynamiquement des propriétés à une classe en Python ?
Vous souhaitez créer une classe fictive qui imite un ensemble de résultats de base de données. Lorsqu'une requête de base de données renvoie, par exemple, {'ab':100, 'cd':200}, vous vous attendez à voir :
>>> dummy.ab 100
Bien que l'ajout d'une propriété à un est réalisable de manière dynamique, elle doit être ajoutée à la classe elle-même.
>>> class Foo(object): ... pass ... >>> foo = Foo() >>> foo.a = 3 >>> Foo.b = property(lambda self: self.a + 1) >>> foo.b 4
Une propriété est une simple implémentation d'un descripteur, qui est un objet qui fournit une gestion d'attributs personnalisés sur une classe particulière. Il remplace un arbre if étendu dans __getattribute__.
Lorsque vous demandez foo.b, Python reconnaît que le b défini sur la classe suit le protocole du descripteur, qui indique simplement un objet avec un méthode get__, __set__ ou __delete. Le descripteur assume la responsabilité de la gestion de cet attribut, invitant Python à appeler Foo.b.__get__(foo, Foo), et la valeur de retour vous est renvoyée en tant que valeur de l'attribut. Dans le cas de la propriété, chacune de ces méthodes invoque simplement le fget, le fset ou le fdel que vous avez fourni au constructeur de la propriété.
Les descripteurs sont le mécanisme de Python permettant d'exposer les subtilités de son implémentation globale OO. Soit dit en passant, il existe un type distinct de descripteur qui est encore plus répandu que la propriété.
>>> class Foo(object): ... def bar(self): ... pass ... >>> Foo().bar <bound method Foo.bar of <__main__.Foo object at 0x7f2a439d5dd0>> >>> Foo().bar.__get__ <method-wrapper '__get__' of instancemethod object at 0x7f2a43a8a5a0>
La méthode humble est encore un autre type de descripteur. Son get préfixe l'instance appelante comme premier argument ; en substance, il fait ceci :
def __get__(self, instance, owner): return functools.partial(self.function, instance)
C'est probablement la raison pour laquelle les descripteurs ne s'appliquent qu'aux classes : ils formalisent les mécanismes qui sous-tendent les classes en premier lieu. Ils constituent l'exception à la règle : vous pouvez sans aucun doute attribuer des descripteurs à une classe, même si les classes elles-mêmes sont des instances de type. En fait, tenter de récupérer Foo.bar invoque toujours property.__get__; cependant, il est idiomatique que les descripteurs se renvoient eux-mêmes lorsqu'ils sont accessibles en tant qu'attributs de classe.
Les descripteurs permettent à la majorité du système OO de Python d'être écrit en Python lui-même.
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!