Je pense que j'ai une idée fausse des variables de classe et d'instance. Voici un exemple de code :
class Animal(object):
energy = 10
skills = []
def work(self):
print 'I do something'
self.energy -= 1
def new_skill(self, skill):
self.skills.append(skill)
if __name__ == '__main__':
a1 = Animal()
a2 = Animal()
a1.work()
print a1.energy # result:9
print a2.energy # result:10
a1.new_skill('bark')
a2.new_skill('sleep')
print a1.skills # result:['bark', 'sleep']
print a2.skills # result:['bark', 'sleep']
Je pensais que energy
y skill
étaient des variables de classe, car je les ai déclarées en dehors de toute méthode. Je modifie ses valeurs à l'intérieur des méthodes de la même manière (avec self
dans sa déclaration, peut-être incorrecte ?). Mais les résultats me montrent que energy
prend des valeurs différentes pour chaque objet (comme une variable d'instance), alors que skills
semble être partagée (comme une variable de classe). Je pense que j'ai raté quelque chose d'important...
4 votes
Cette question est plus subtile que ce doublon, puisqu'elle porte sur la différence de comportement entre deux attributs de classe. Je suis sûr qu'un doublon existe encore, mais pas celui-là.
4 votes
Oui, tu l'as fait. L'énergie est immuable et l'assigner à celle-ci remplace la variable, mais sur l'instance, laissant la classe seule. D'un autre côté, vous ne remplacez pas les compétences, vous ajoutez à l'instance partagée sur la classe.
2 votes
Quant à la réponse, vous n'avez pas "modifié les valeurs de la même manière" comme vous le prétendez. Vous avez modifié l'énergie avec
self.energy -= 1
, un devoir ; vous avez modifiéskills
avecself.skills.append(...)
un appel de méthode. Ce sont des choses différentes.0 votes
@BrenBarn : Je cherchais des posts supplémentaires à mettre en lien lorsque je suis entré dans le système de tunnels de Londres.
0 votes
@BrenBarn : Je cherchais Pourquoi += se comporte-t-il de manière inattendue sur les listes ? C'est en quelque sorte l'inverse de ce qui se passe ici (une valeur immuable contre une valeur mutable).