Domanda

Non riesco a capire cosa sta succedendo qui:

class testclass: 

    def __init__(self): 
        print "new instance" 
    myList=[] 

if __name__ == "__main__":  

    inst1=testclass() 
    inst1.myList.append("wrong") 

    inst2=testclass() 
    inst2.myList.append("behaviour") 

    print "I get the",inst2.myList

L'output è:

new instance
new instance
I get the ['wrong', 'behaviour']

Mi sarei aspettato che l'elenco in Inst1 Non sa nulla dell'elenco in Inst2, ma in qualche modo sembra la portata di la mia lista Traccesse l'istanziazione della classe. Trovo questo molto inquietante e sconcertante, o mi manca qualcosa qui?

Grazie!

È stato utile?

Soluzione

Il modo in cui hai definito myList è un attributo di classe.

Il comportamento che stai cercando è quello di un attributo dell'oggetto:

class testclass:
    def __init__(self): 
        print "new instance"
        self.myList = []

Proviamolo:

>>> t1 = testclass()
new instance
>>> t2 = testclass()
new instance
>>> t1.myList.append(1)
>>> t2.myList.append(2)
>>> t1.myList
[1]
>>> t2.myList
[2]

Se sei interessato agli attributi di classe, dai un'occhiata al Documentazione di classe. Poiché anche le lezioni di Python sono oggetti, come (quasi) tutto in Python, possono avere i propri attributi.

Altri suggerimenti

Il modo in cui hai dichiarato myList All'interno della classe lo rende un classe attributo. Se intendevi avere un esempio attributo, dichiararlo così e avrà il comportamento previsto:

class testclass:
    def __init__(self): 
        print "new instance" 
        self.myList=[]

Sì, perché questo è a cosa servono gli attributi di classe. Se si desidera una variabile di istanza, devi dichiararla sull'istanza stessa - di solito con self All'interno di un metodo.

myList è inizializzato a classe tempo di istanza, perché è dichiarato nel corpo della classe, non a oggetto Tempo di istanza.

Tali proprietà vengono quindi condivise con istanze, fino a quando non viene creata una variabile con lo stesso nome sull'istanza.

Quindi, nel tuo caso, stai usando ogni oggetto per accedere allo stesso modo myList oggetto (e aggiungere un valore ad esso).

class testclass:

    def __init__(self):
        self.myList=[]
        print "new instance"

Se vuoi che MyList sia una variabile di istanza, dovresti definire auto -milist all'interno della funzione Init. Quindi dovresti ottenere il comportamento che ti aspetti. Come ce l'hai ora, penso che MyList sia una variabile di classe e sarà condivisa da tutte le istanze della classe.

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