Indirizzamento della stringa del nome dell'istanza in __init __ (self) in Python
-
22-07-2019 - |
Domanda
Sto facendo una cosa del genere:
class Class(object):
def __init__(self):
self.var=#new instance name string#
Come posso utilizzare il metodo __ init __ della mia istanza per usare la stringa del nome dell'istanza per 'c'? Di 'nel caso:
c=Class()
Voglio c.var uguale a 'c'.
Grazie per le tue risposte, sto implementando la persistenza e Class è la classe di oggetti persistenti. Voglio che __ init __ aggiunga una voce al database quando:
del c
Quindi, supponiamo:
<*>Più tardi:
<*>potrebbe creare un'istanza utilizzando i dati dal database se esiste già una voce 'c', altrimenti creare una nuova voce.
Grazie per le tue risposte, sto implementando la persistenza e Class è la classe di oggetti persistenti. Voglio che __ init __ aggiunga una voce al database quando:
<*>Quindi, supponiamo:
<*>Più tardi:
<*>potrebbe creare un'istanza utilizzando i dati dal database se esiste già una voce 'c', altrimenti creare una nuova voce.
Soluzione
Per rendere persistenti gli oggetti dati è necessario utilizzare l'ID univoco del record del database.
codice pesudo perché non so quale modulo di database stai utilizzando
import db # assume this is your db module
class Class(object):
def __init__(self):
self.id = None
self.name = None
def get_by_id(self, id):
records = db.execute('select * from table where id=%s' % str(id))
if records:
self.id = records[0]['id']
self.name = records[0]['name']
def save(self):
db.execute('update table set name=%s where id=%s' % (self.name, str(self.id)))
Ancora una volta, questo è pseudo codice, la tecnica di iniezione di stringhe che sto usando NON è consigliata in quanto abbastanza insicura, è solo lì per illustrare come persistere usando le classi con un db.
Altri suggerimenti
Python non ha variabili, ha oggetti e nomi . Quando lo fai
c = Class()
stai facendo due cose:
- Creazione di un nuovo oggetto di tipo
Class
- Associando l'oggetto al nome
c
nell'ambito corrente.
L'oggetto che hai creato non ha alcun concetto di " nome variabile " - Se dopo lo fai
a = c
quindi lo stesso oggetto è accessibile esattamente allo stesso modo usando i nomi a
e c
. Puoi eliminare il nome a
e l'oggetto esisterebbe ancora.
Se gli oggetti che crei devono avere un nome, il modo migliore è passargli esplicitamente ,
class Class(object):
def __init__(self, name):
self.name = name
var = Class('var')
Non puoi farlo. La ragione di ciò è che l'oggetto della classe viene creato per primo, e solo successivamente l'oggetto è legato al nome dell'istanza.
Non puoi (a meno di incredibili hack come esaminare il frame dello stack e ispezionare il bytecode). Potrebbe non esserci nemmeno essere un nome, oppure potrebbero esserci più nomi di questo tipo. Cosa dovrebbe essere dato per i seguenti frammenti di codice, ad esempio:
l = [Class(), Class()]
a=b=c=d=Class()
Non credo che ciò sarebbe possibile perché l'assegnazione alla variabile della nuova istanza si verifica dopo che l'oggetto è stato completamente costruito e inizializzato e quindi non si conosce il nome della variabile a cui verrà assegnato entro init metodo
Non sono a conoscenza di un modo per accedere al nome di una variabile a livello di codice senza utilizzare la riflessione approfondita e un debugger. Non credo che le informazioni siano disponibili in fase di esecuzione.
Se si desidera assegnare alle istanze un nome (univoco?), è probabile che l'inizializzatore accetti un argomento aggiuntivo.
def __init__(self, name):
self.name = name
E il chiamante deve passare con il nome appropriato:
c = Class("c")
Questo è un problema di portata, non puoi fare quello che stai chiedendo. Poiché c verrebbe dichiarato al di fuori dell'ambito della classe, l'istanza non è a conoscenza di come è stata denominata nel codice.
Forse puoi fornire una spiegazione più ampia di ciò che stai cercando di ottenere una soluzione migliore.
Questo non è possibile. Sembra che tu confonda variabili e oggetti.
In ogni caso potrebbe non esserci una variabile:
per es.
foo(Class())
Class().arbitraryMethod()
O multipli:
a = b = Class()
Ho lo stesso pensiero diversi anni fa. Questa è una sorta di caratteristica ordinata, ma il creatore della lingua non lo fornisce. E ho pensato che fossero tutti pazzi a non scoprire questa fantastica funzionalità.
Ma poi vieni a pensarci. Penso che la logica sia impossibile. dire:
class Class(object):
def __init__(self):
self.instance_name.move() # self.instance_name refer to var
def move(self):
print "move"
var = Class()
ora se var è un array è possibile anche questo?
var[0] = Class() # i think it will get confused a bit
è quello che penso, non penso che sia possibile assegnare l'istanza a se stessa. e in qualche lingua ho appena inviato la stringa di istanza nell'oggetto quindi usando eval per eseguire la funzione