Auto-enregistrer les méthodes de classe en utilisant un décorateur
Je veux être en mesure de créer un python décorateur automatiquement des "registres" les méthodes de la classe dans un référentiel global (avec certaines propriétés).
Exemple de code:
class my_class(object):
@register(prop1,prop2)
def my_method( arg1,arg2 ):
# method code here...
@register(prop3,prop4)
def my_other_method( arg1,arg2 ):
# method code here...
Je veux que quand le chargement est terminé, quelque part, il y aura un dict contenant:
{ "my_class.my_method" : ( prop1, prop2 )
"my_class.my_other_method" : ( prop3, prop4 ) }
Est-ce possible?
source d'informationauteur adamk
Vous devez vous connecter pour publier un commentaire.
Pas avec juste un décorateur, pas. Mais une métaclasse peut automatiquement de travail avec une classe après son été créé. Si votre
register
décorateur juste fait des notes sur ce que la métaclasse devrait le faire, vous pouvez effectuer les opérations suivantes:impression
Voici un peu d'amour pour la classe des décorateurs. Je pense que la syntaxe est légèrement plus simple que pour les metaclasses.
Si vous avez besoin d'classes nom, l'utilisation de Matt solution. Toutefois, si vous êtes ok avec le fait d'avoir ces méthodes nom ou une référence à la méthode -- dans le registre, cela pourrait être un moyen plus simple de le faire:
impression
Pas aussi beau ou élégant, mais sans doute la façon la plus simple si vous avez uniquement besoin de ce dans une seule classe:
Pas facile, mais si vous utilisez Python 3, cela devrait fonctionner:
Notez que vous ne pouvez pas avoir de la méthode de noms égal au décorateur nom dans la méta-tapé classe, parce qu'ils sont automatiquement supprimés par le
del
commande dans la métaclasse est__new__
méthode.Pour la version 2.6 de Python, je pense que vous devez indiquer explicitement le décorateur le nom de la classe à utiliser.
Pas. Le décorateur reçoit la fonction avant il est devenu une méthode, donc vous ne savez pas dans quelle classe il est.