2011-10-06 17 views
5

Posiadam dekorator w PY. Jest to metoda i przyjmuje funkcję jako parametr. Chcę utworzyć strukturę katalogów opartą na przekazanej funkcji. Używam nazwy modułu dla katalogu nadrzędnego, ale chcę użyć nazwy klasy dla podkatalogu. Nie mogę wymyślić, jak uzyskać nazwę klasy, która jest właścicielem obiektu fn.Uzyskaj klasę funkcji Pythona od dekoratora

Moja Dekorator:

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

fn.im_class .__ nazwa__ – janoliver

+0

podać specjalny argument w dekoratorze z napisem 'is_member_func', jeśli to prawda, uzyskać pierwszy argument, który jest self. –

Odpowiedz

8

Jeśli fn jest instancemethod, a następnie można użyć fn.im_class.

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

Zauważ, że to będzie nie praca z dekorator, ponieważ funkcja przekształca tylko do metody instancji po klasa jest zdefiniowana (czyli jeśli @specialTest użyto do dekoracji bar, nie byłoby pracować, jeśli jest to nawet możliwe, robienie tego w tym miejscu musiałoby zostać wykonane poprzez sprawdzenie stosu wywołań lub czegoś równie nieszczęśliwego).

+0

Tego właśnie się obawiałem. Dzięki. –

+0

Z jakiegoś powodu to się nie rejestrowało, dopóki nie wróciłem do kodu. Jest to możliwe, po prostu muszę przenieść mój kod, który współdziała z FN wewnątrz funkcji zawijanej, gdzie FN jest instancją. –

+0

Nie jest to możliwe w czasie definicji, ale można wyświetlić listę funkcji dekorowanych po utworzeniu klasy: aby osiągnąć ten cel, dekorator musi umieścić atrybut znacznika na klasie – kolypto

6

W Pythonie 2 można użyć atrybutu im_class w obiekcie metody. W języku Python 3 będzie to __self__.__class__ (lub type(method.__self__)).

Powiązane problemy