2009-03-16 6 views
2

Je suis un peu nouveau sur Python, et je n'ai pas été en mesure de trouver une réponse à cette question de la recherche en ligne.En Python, est-il possible d'accéder à la classe qui contient une méthode, donnée seulement un objet méthode?

Voici un décorateur exemple qui ne fait rien (encore)

def my_decorator(text): 
    def wrap(f): 
    # grab magic f.parent_class_object.my_var and append text 
    def wrap_f(*args, **kwargs): 
     f(*args, **kwargs) 
    return wrap_f 
    return wrap 

Voici un exemple de classe

class MyClass: 
    my_var = [] 

    @my_decorator('sometext') 
    def my_func() 
    # do some super cool thing 

Dans mon décorateur je voudrais accéder à l'objet de classe pour MyClass et ajouter dans 'sometext' à la liste MyClass.my_var. Mon but est de remplir my_var avec des valeurs décorées au charge du module heure, pas la fonction call time.

Y at-il un moyen que je peux naviguer de f à MyClass pour ce faire? Je sais que * args [0] est l'instance de MyClass, mais cela n'est disponible que lorsque la fonction est appelée.

Répondre

3

Il n'est pas possible de le lire à partir d'une fonction à l'intérieur d'un décorateur de classes, puisque les "méthodes" sont toujours des fonctions normales pendant la compilation de la classe. De plus, le nom de la classe n'a pas été défini pendant sa compilation. Vous pouvez fournir la liste my_var au décorateur.

class MyClass: 
    my_var = [] 

    @my_decorator(my_var, 'sometext') 
    def my_func() 
     # do some super cool thing 

my_var est encore une variable normale d'ici là.

Questions connexes