En Python, ¿es posible acceder a la clase que contiene un método, dado solo un objeto de método?
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.
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.