En Python, est-il possible d'accéder à la classe qui contient une méthode, étant donné qu'un objet méthode?
Question
Je connais assez bien Python et je n'ai pas trouvé de réponse à cette question en effectuant une recherche en ligne.
Voici un exemple de décorateur 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, j'aimerais accéder à l'objet de classe pour MyClass
et ajouter "sometext" à la liste MyClass.my_var
. Mon objectif est de renseigner my_var avec les valeurs décorées à l'heure de chargement du module , et non à l'heure d'appel des fonctions.
Pour ce faire, puis-je naviguer de f
à MyClass
? Je sais que * args [0] est l'instance de MyClass, mais elle n'est disponible que lorsque la fonction est appelée.
La solution
Il n'est pas possible de le lire à partir d'une fonction dans un décorateur de classe, car les "méthodes" continuent à fonctionner normalement pendant la compilation de la classe. De plus, le nom de la classe n’a pas été défini pendant la 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 toujours une variable normale d'ici là.