En Python, ¿es posible acceder a la clase que contiene un método, dado solo un objeto de método?

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

  •  19-08-2019
  •  | 
  •  

Pregunta

Soy bastante nuevo en Python y no he podido encontrar una respuesta a esta pregunta buscando en línea.

Aquí hay un decorador de ejemplo que no hace nada (todavía)

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

Aquí hay una clase de ejemplo

class MyClass:
  my_var = []

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

En mi decorador, me gustaría acceder al objeto de clase para MyClass y agregar 'sometext' a la lista MyClass.my_var . Mi objetivo es llenar my_var con valores decorados en carga del módulo , no en función del tiempo de llamada.

¿Hay alguna forma de navegar de f a MyClass para hacer esto? Sé que * args [0] es la instancia de MyClass, pero eso solo está disponible cuando se llama a la función.

¿Fue útil?

Solución

No es posible leerlo desde una función dentro de un decorador de clase, ya que los "métodos" siguen siendo una función normal mientras se compila la clase. Además, el nombre de la clase no se ha definido mientras se está compilando.

Lo que puede hacer es proporcionar la lista my_var al decorador.

class MyClass:
    my_var = []

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

my_var sigue siendo una variable normal para entonces.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top