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.

È stato utile?

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:

  1. Creazione di un nuovo oggetto di tipo Class
  2. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top