non può essere normalmente fatto, anche se questo può essere ottenuto utilizzando l'introspezione e strutture significava per il debug di un programma. Il codice deve essere eseguito da un file ".py", e non dal semplice codice bytecode compilato o all'interno di un modulo zippato, poiché si basa sulla lettura del codice sorgente del file, all'interno del metodo che dovrebbe trovare "dove si trova in esecuzione".
Il trucco è quello di accedere alla cornice di esecuzione in cui l'oggetto è stato inizializzato da - con inspect.currentframe - l'oggetto cornice ha un valore "f_lineno", che indica il numero di riga in cui la chiamata al metodo oggetto (in questo caso, __init__
) è stato chiamato. La funzione inspect.filename consente di recuperare il codice sorgente per il file e recuperare il numero di linea appropriato.
Un'analisi naifa quindi dà un'occhiata alla parte che precede un segno "=" e presuppone che sia la variabile che conterrà l'oggetto.
from inspect import currentframe, getfile
class A(object):
def __init__(self):
f = currentframe(1)
filename = getfile(f)
code_line = open(filename).readlines()[f.f_lineno - 1]
assigned_variable = code_line.split("=")[0].strip()
print assigned_variable
my_name = A()
other_name = A()
che non funziona per più assignents, espressioni che compongono con l'oggetto prima della assignemtn è fatto, oggetti che vengono aggiunti alle liste o aggiunti a dizionari o in blocco, di istanze di oggetti in intialization di for
loop, e Dio sa quali più situazioni - E tenete presente che dopo la prima attribuzione, l'oggetto potrebbe essere referenziato anche da qualsiasi altra variabile.
linea Botton: esso è possibile, ma come un giocattolo - non può essere utilizzato i codice di produzione - semplicemente il nome varibal da passare come stringa durante l'inizializzazione oggetto, così come si deve fare quando si crea un
il "modo giusto" collections.namedtuple
per farlo, se si ha bisogno il nome, è quello di passare in modo esplicito il nome per l'inizializzazione dell'oggetto, come un parametro di stringa, come in:
class A(object):
def __init__(self, name):
self.name = name
x = A("x")
E ancora, se assolutamente bisogno di digitare il nome degli oggetti solo una volta, lì è un altro modo - continua a leggere. A causa della sintassi di Python, alcune assegnazioni speciali, che non utilizzano l'operatore "=", consentono a un oggetto di sapere che è stato assegnato un nome. Quindi, altri statemi che eseguono assegnatari in Python sono le parole chiave for, with, def e class - È possibile abusarne, poiché in modo specifico una creazione di classe e una definizione di funzione sono istruzioni di assegnazione che creano oggetti che "conoscono" i loro nomi.
Concentriamoci sull'istruzione def
. Generalmente crea una funzione. Ma usando un decoratore è possibile utilizzare "def" per creare qualsiasi tipo di oggetto - e hanno il nome usato per la funzione disponibile al costruttore:
class MyObject(object):
def __new__(cls, func):
# Calls the superclass constructor and actually instantiates the object:
self = object.__new__(cls)
#retrieve the function name:
self.name = func.func_name
#returns an instance of this class, instead of a decorated function:
return self
def __init__(self, func):
print "My name is ", self.name
#and the catch is that you can't use "=" to create this object, you have to do:
@MyObject
def my_name(): pass
(Questo ultimo modo di farlo potrebbe essere utilizzato in codice di produzione, a differenza di quello che ricorre alla lettura del file sorgente)
Non è possibile - anche se di recente (3-4 mesi fa) sulle python-idee lista c'è stata qualche discussione sull'aggiunta di una capacità a qualcosa di simile. – jsbueno
La risposta breve è: no, non provare ..e la vera risposta è sì, ma non provare .. :) – wim