2011-10-06 17 views
5

Tengo un decorador en PY. Es un método y toma la función como un parámetro. Quiero crear una estructura de directorio basada en la función aprobada. Estoy usando el nombre del módulo para el directorio padre pero me gustaría usar el nombre de clase para un subdirectorio. No puedo entender cómo obtener el nombre de la clase propietaria del objeto fn.Obtiene la clase propietaria de la función Python del decorador

Mi decorador:

def specialTest(fn): 
    filename = fn.__name__ 
    directory = fn.__module__ 
    subdirectory = fn.__class__.__name__ #WHERE DO I GET THIS 
+0

fn.im_class .__ name__ – janoliver

+0

da un argumento especial en el decorador que dice 'is_member_func', si es verdadero obtén el primer argumento que es self. –

Respuesta

8

Si fn es un instancemethod, entonces usted puede utilizar fn.im_class.

 
>>> class Foo(object): 
...  def bar(self): 
...   pass 
... 
>>> Foo.bar.im_class 
__main__.Foo 

Nota que esto no trabajo de un decorador, debido a que una función sólo se transforma en un método de instancia después de se define la clase (es decir, si @specialTest se utilizó para decorar bar, no lo sería trabajo, si es posible, hacerlo en ese punto tendría que hacerse inspeccionando la pila de llamadas o algo igualmente infeliz).

+0

Eso es lo que temía. Gracias. –

+0

Por alguna razón, esto no se registró hasta que volví al código. Esto es posible, simplemente tengo que mover mi código que interactúa con el FN dentro de la función envuelta, donde FN es una instancia. –

+0

Eso no es posible en el momento de la definición, sin embargo, puede enumerar funciones decoradas después de que se creó la clase: para lograr esto, el decorador debe colocar algún atributo de marcador en la clase – kolypto

6

En Python 2 puede usar el atributo im_class en el objeto de método. En Python 3, será __self__.__class__ (o type(method.__self__)).

Cuestiones relacionadas