2009-05-21 6 views
29
  • Nazwa pliku z którego kod jest uruchomiony
  • Nazwa klasy, z której kod jest uruchomiony
  • nazwa metody (atrybut klasy), gdzie kod jest uruchomiony

Odpowiedz

31

Oto przykład każda:

from inspect import stack 

class Foo: 
    def __init__(self): 
     print __file__ 
     print self.__class__.__name__ 
     print stack()[0][3] 

f = Foo() 
+2

Czy próbujesz uruchomić go z wiersza poleceń? To oczywiście nie jest zdefiniowane; spróbuj utworzyć plik z kodem i wykonując nazwę Pythona - będzie działał zgodnie z oczekiwaniami. –

+0

uruchomić go z pliku – mtasic85

+2

Dlaczego nie sprawdzić.currentframe? – tzot

5
self.__class__.__name__ # name of class i'm in 

dla reszty sYS i śladowe moduły

http://docs.python.org/library/sys.html http://docs.python.org/library/trace.html

Niektórzy więcej informacji: https://mail.python.org/pipermail/python-list/2001-August/096499.html i http://www.dalkescientific.com/writings/diary/archive/2005/04/20/tracing_python_code.html

chciałeś go do raportowania błędów, ponieważ moduł traceback może obsłużyć że:

http://docs.python.org/library/traceback.html

9
import sys 

class A: 
    def __init__(self): 
     print __file__ 
     print self.__class__.__name__ 
     print sys._getframe().f_code.co_name 

a = A() 
4

Bądź ostrożny pod numerem bardzo. Zastanów się:

class A: 
    pass 

B = A 
b = B() 

Co to jest "nazwa klasy" b tutaj? Czy to A, czy B? Czemu?

Chodzi o to, że nie powinieneś o tym wiedzieć. Obiekt jest tym, czym jest: jego nazwa jest bardzo rzadko przydatna.

+4

Nazwa klasy to "A", ponieważ 'b' jest ** instancją ** z' B', która z kolei jest ** referencją ** do 'A', która jest ** klasą **. – ted

+0

Z pewnością dla użytkowników końcowych; ale niezwykle przydatne przy debugowaniu - jak w przypadku obsługi wyjątku lub podobnej do zgłaszania, gdzie jest. Możesz napisać miły komunikat o błędzie, aby powiedzieć to samo, ale i tak często zawierałby tę informację, w takim przypadku wydaje się, że za każdym razem wpisywanie jest niepotrzebne. Ponadto, aby zbudować (na przykład) ogólny pakiet rejestracyjny, niezwykle przydatna jest możliwość zapewnienia tego automatycznie. Gdyby twoja argumentacja się utrzymywała, czy nie odnosiłaby się równie dobrze do isinstance(), która z pewnością jest ważna i przydatna? – TextGeek

Powiązane problemy