Question

Je n'arrive pas à comprendre ce qui se passe ici:

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

Le résultat est:

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

Je me serais attendu à ce que la liste dans inst1 ne sache rien sur la liste dans inst2 , mais en quelque sorte, elle ressemble à la portée de maListe transcende l'instanciation de la classe. Je trouve cela très troublant et déroutant, ou est-ce que je manque quelque chose ici?

Merci!

Était-ce utile?

La solution

La façon dont vous avez défini myList est un attribut de classe.

Le comportement que vous recherchez est celui d'un attribut d'objet:

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

Essayons:

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

Si vous êtes intéressé par les attributs de classe, consultez la documentation de la classe .Puisque les classes en Python sont aussi des objets, comme (presque) tout en Python, elles peuvent avoir leurs propres attributs.

Autres conseils

La façon dont vous avez déclaré myList dans la classe en fait un attribut class .si vous avez l'intention d'avoir un attribut instance , déclarez-le comme ceci et il aura le comportement attendu:

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

Oui, car c'est à cela que servent les attributs de classe.Si vous voulez une variable d'instance, vous devez la déclarer sur l'instance elle-même - généralement avec self dans une méthode.

myList est initialisé au moment de l'instanciation de la classe , car il est déclaré dans le corps de la classe et non au moment de l'instanciation de objet .

Ces propriétés sont ensuite partagées avec les instances, jusqu'à ce qu'une variable du même nom soit créée sur l'instance.

Donc, dans votre cas, vous utilisez chaque objet pour accéder au même objet myList (et y ajouter une valeur).

class testclass:

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

Si vous voulez que myList soit une variable d'instance, vous devez définir self.myList dans la fonction init.Ensuite, vous devriez obtenir le comportement que vous attendez.Comme vous l'avez maintenant, je pense que myList est une variable de classe, et sera partagée par toutes les instances de la classe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top