Domanda

class Ball:
  a = []
  def __init__(self):
    pass

  def add(self,thing):
    self.a.append(thing)

  def size(self):
    print len(self.a)

for i in range(3):
  foo = Ball()
  foo.add(1)
  foo.add(2)
  foo.size()

Mi aspetto un ritorno di:

2
2
2

Ma ottengo:

2
4
6

Perché questo? Ho scoperto che facendo un = [] in init , posso aggirare questo comportamento, ma non sono chiaro perché.

È stato utile?

Soluzione

doh

Ho appena capito perché.

Nel caso sopra, a è un attributo di classe, non un attributo di dati - questi sono condivisi da tutte le palle (). Commentare a = [] e posizionarlo nel blocco init significa invece che è un attributo di dati. (E poi non potevo accedervi con foo.a, cosa che non dovrei fare comunque.) Sembra che gli attributi della classe si comportino come attributi statici della classe, sono condivisi da tutte le istanze.

Whoa.

Una domanda però: CodeCompletion fa schifo in questo modo. Nella classe foo, non posso fare da solo. (Variabile), perché non è definito automaticamente - è definito da una funzione. Posso definire una variabile di classe e sostituirla con una variabile di dati?

Altri suggerimenti

Quello che probabilmente vuoi fare è:

class Ball:
  def __init__(self):
    self.a = []

Se usi solo a = [] , crea una variabile locale nella funzione __init__ , che scompare quando la funzione ritorna. L'assegnazione a self.a lo rende una variabile di istanza che è ciò che stai cercando.

Per un gotcha semi-correlato, vedi come puoi cambiare il valore dei parametri predefiniti per i futuri chiamanti .

" Posso definire una variabile di classe e sostituirla con una variabile di dati? "

No. Sono cose separate. Una variabile di classe esiste esattamente una volta - nella classe.

Potresti - per terminare il completamento del codice - iniziare con alcune variabili di classe e quindi eliminare quelle righe di codice dopo aver scritto la tua classe. Ma ogni volta che ti dimentichi di fare ciò non accadrà nulla di buono.

Meglio provare un IDE diverso. Komodo Modifica completamenti del codice sembra essere ragionevole.

Se hai così tante variabili con nomi così lunghi che il completamento del codice è effettivamente utile, forse dovresti ridurre le tue classi o usare nomi più brevi. Sul serio.

Trovo che quando arrivi in ??un posto in cui il completamento del codice è più utile che fastidioso, hai superato il "tieni tutto nel mio cervello" soglia di complessità. Se la lezione non si adatta al mio cervello, è troppo complessa.

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