Ici, j'ai un attribut "a", qui est défini dans la méthode de première classe et devrait être modifié en deuxième. Lorsque vous les appelez dans l'ordre, ce message apparaît:
AttributeError: l'objet 'Class' n'a pas d'attribut 'a'
La seule façon que j'ai trouvée - définissez à nouveau 'a' dans la deuxième méthode, mais dans le code réel, il a un long héritage et l'application sera gâchée. Pourquoi ça ne marche pas? self.a n'est-il pas égal à Class.a?
class Class(object):
def method_1(self):
self.a = 1
def method_2(self):
self.a += 1
Class().method_1()
Class().method_2()
Réponse courte, non. Le problème avec votre code est que chaque fois que vous créez une nouvelle instance.
Edit : Comme abarnert le mentionne ci-dessous, il y a une grande différence entre Class.a
et c.a
. Les attributs d'instance (le deuxième cas) appartiennent à chaque objet spécifique, tandis que les attributs de classe appartiennent à la classe. Regardez le commentaire d'abarnert ci-dessous ou la discussion ici pour plus d'informations.
Votre code est équivalent à
c1 = Class()
c1.method_1() # defines c1.a (an instance attribute)
c2 = Class()
c2.method_2() # c2.a undefined (the c2 instance doesn't have the attribute)
Vous voulez probablement faire quelque chose comme
c = Class()
c.method_1() # c.a = 1
c.method_2() # c.a = 2
print "c.a is %d" % c.a # prints "c.a is 2"
Ou encore mieux serait d'initialiser c
avec un attribut a
class Class:
def __init__(self):
self.a = 1 # all instances will have their own a attribute
Une nouvellement créée instance de Class
n'a pas d'attribut a
lorsque vous faites instance_of_class.method_2()
sans appeler method_1
, Comme dans votre exemple.
Considérez cette version légèrement modifiée de votre code:
class CreateNewClassInstance(object):
def create_a(self):
self.a = 1
def add_one_to_a(self):
self.a += 1
CreateNewClassInstance().create_a()
CreateNewClassInstance().add_one_to_a()
Chaque fois que vous appelez Class()
(ou CreateNewClassInstance()
), vous créez un objet nouvea, avec son propre attribut a
. Tant que vous n'avez pas initialisé a
, vous n'avez pas d'attribut avec ce nom.
La plupart du temps, ce n'est pas un problème - cependant, +=
Essaiera de charger self.a
Avant d'en ajouter un - ce qui est à l'origine de votre AttributeError
dans ce cas .