98 votes

Comment obtenir toutes les méthodes d'une classe python avec un décorateur donné ?

Comment obtenir toutes les méthodes d'une classe A donnée qui sont décorées avec le @decorator2 ?

class A():
    def method_a(self):
      pass

    @decorator1
    def method_b(self, b):
      pass

    @decorator2
    def method_c(self, t=5):
      pass

2 votes

Avez-vous un contrôle sur le code source de "decorator2" ?

11 votes

Disons que non, juste pour garder l'intérêt. mais quand cela rend la solution beaucoup plus facile, cette solution m'intéresse aussi.

17 votes

+1 : "garder l'intérêt" : apprendre davantage de cette façon

1voto

Je ne veux pas ajouter grand chose, juste une simple variation de la méthode 2 de ninjagecko. Elle fonctionne à merveille.

Même code, mais en utilisant la compréhension de liste au lieu d'un générateur, ce qui est ce dont j'avais besoin.

def methodsWithDecorator(cls, decoratorName):

    sourcelines = inspect.getsourcelines(cls)[0]
    return [ sourcelines[i+1].split('def')[1].split('(')[0].strip()
                    for i, line in enumerate(sourcelines)
                    if line.split('(')[0].strip() == '@'+decoratorName]

0voto

Thomas King Points 111

Une façon simple de résoudre ce problème est de mettre du code dans le décorateur qui ajoute chaque fonction/méthode, qui est passée, à un ensemble de données (par exemple une liste).

par exemple

def deco(foo):
    functions.append(foo)
    return foo

maintenant chaque fonction avec le déco sera ajouté à fonctions .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X