En Python, est-il possible d'accéder à la classe qui contient une méthode, étant donné qu'un objet méthode?

StackOverflow https://stackoverflow.com/questions/649329

  •  19-08-2019
  •  | 
  •  

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.

Était-ce utile?

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à.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top