2009-05-21 20 views
29
  • Name der Datei aus dem Code
  • Name der Klasse ausgeführt wird, von dem Code
  • Name der Methode (Attribut der Klasse) ausgeführt wird, wenn der Code ausgeführt wird

Antwort

31

Hier ein Beispiel für jeden ist:

from inspect import stack 

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

f = Foo() 
+2

Versuchen Sie, es über die Befehlszeile auszuführen? Es ist offensichtlich dann nicht definiert; Versuchen Sie, eine Datei mit dem Code zu erstellen und den Python-Dateinamen zu erstellen - es wird wie erwartet funktionieren. –

+0

Führen Sie es aus Datei – mtasic85

+2

Warum nicht inspect.currentframe? – tzot

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

für den Rest der sys und Trace-Module

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

Einige weitere Informationen: https://mail.python.org/pipermail/python-list/2001-August/096499.html und http://www.dalkescientific.com/writings/diary/archive/2005/04/20/tracing_python_code.html

haben Sie wollen, dass es für die Fehlerberichterstattung, da die Rückverfolgungsmodul damit umgehen kann:

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

Seien Sie sehr vorsichtig. Betrachte:

class A: 
    pass 

B = A 
b = B() 

Was ist der 'Klassenname' von b hier? Ist es A oder B? Warum?

Der Punkt ist, Sie sollten nicht wissen oder kümmern. Ein Objekt ist das, was es ist: Sein Name ist sehr selten nützlich.

+4

Der Klassenname ist 'A', da' b' eine ** Instanz ** von 'B' ist, die wiederum eine ** Referenz ** zu' A' ist, was eine ** Klasse ** ist. – ted

+0

Endbenutzer sicher; aber extrem nützlich beim Debuggen - wie bei einem Exception-Handler oder ähnlich, um zu berichten, wo es ist. Du könntest eine nette Fehlermeldung schreiben, um das gleiche zu sagen, aber es hat diese Information häufig trotzdem, in diesem Fall scheint es eine Verschwendung, es jedes Mal zu tippen. Um beispielsweise ein allgemeines Protokollierungspaket zu erstellen, ist es sehr nützlich, dies automatisch bereitstellen zu können. Wenn Ihre Argumentation zutrifft, würde das nicht auch für isinstance() gelten, was sicherlich wichtig und nützlich ist? – TextGeek

Verwandte Themen