web-dev-qa-db-fra.com

L'attribut créé dans une méthode n'existe pas dans une autre méthode

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()
10
user2309239

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
15
Felipe

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 .

3
Sean Vieira