Le titre n'est peut-être pas la meilleure description de ce que j'essaie de faire mais je ne sais pas trop comment appeler ça. Je suis tombé sur divers concepts apparemment apparentés avec des noms comme "décorateurs", "descripteurs", et "métaclasses" mais je ne sais pas laquelle de ces approches (le cas échéant) je devrais enquêter plus loin!Définition dynamique de méthodes avec des noms dérivés d'un attribut de classe?
Compte tenu des classes suivantes:
class AnimalGreeter(object):
def __init__(self, greeting):
self.greeting = greeting
def greet(self, animal):
print(self.greeting + ", " + animal + "!")
class MyGreeter(AnimalGreeter):
animals = ['dog', 'parrot']
Je voudrais être en mesure d'utiliser une instance de MyGreeter
comme ceci:
greeter = MyGreeter("What's up")
greeter.parrot
# "What's up, parrot!"
En effet, je voudrais qu'il fonctionne comme si je avait défini MyGreeter
comme ceci:
class MyGreeter(AnimalGreeter):
@property
def dog(self):
self.greet('dog')
@property
def parrot(self):
self.greet('parrot')
En En d'autres termes, je veux définir dynamiquement des méthodes (dog()
, etc.) avec des noms dérivés d'un attribut (animals
) de la classe (MyGreeter
).
Quelle est la meilleure façon de faire cela? Merci beaucoup!
Tout mettre en œuvre '__getattr __ (self, animal)'. – AChampion
Cant aide ici, mais je suis intéressé par votre cas d'utilisation. Pourquoi avez-vous besoin de ce comportement? – FabienP
@FabienP, Dans mon cas 'AnimalGreeter' est un modèle Django et' MyGreeter' est un mixin personnalisé qui gère les images avec des noms de fichiers configurables. Je veux avoir accès aux urls de l'image dans les templates de Django mais le système de templates de Django ne permet pas de passer des arguments aux méthodes d'instance. Donc je ne peux pas faire l'équivalent de 'model.image_url ('large')' dans le template. Mais je peux accéder aux propriétés des instances dans les modèles, par exemple 'model.large_image_url'. – tino