Attribut créé dans une méthode qui n'existe pas dans d'autres méthode
Ici, j'ai un attribut 'a', qui est définie dans la première classe de la méthode et doit être modifié dans la seconde.
Lors de l'appel dans l'ordre, ce message apparaît:
AttributeError: 'Class' objet n'a pas d'attribut 'a'
Le seul moyen que j'ai trouvé - définir la " une " de nouveau dans la deuxième méthode, mais dans le code réel, il a longtemps héritage et de l'application sera gâché.
Pourquoi ne pas travailler? N'est-ce pas auto.un égal à Classe.un?
class Class(object):
def method_1(self):
self.a = 1
def method_2(self):
self.a += 1
Class().method_1()
Class().method_2()
Vous devez vous connecter pour publier un commentaire.
Réponse courte, pas de. Le problème avec ton code, c'est qu'à chaque fois que vous créez une nouvelle instance.
Modifier: Comme abarnert mentionne ci-dessous, il y a une grande différence entre
Class.a
etc.a
. Exemple attributs (le deuxième cas) appartiennent à chaque objet spécifique, tandis que la classe attributs appartiennent à la classe. Regardez abarnert de commentaire ci-dessous ou la discussion ici pour plus d'info.Votre code est équivalent à
Vous voulez probablement faire quelque chose comme
Ou probablement même mieux serait d'initialiser
c
avec una
attributself.a
n'est pas égal àClass.a
, au lieu de simplement catégoriquement en disant "non").self.a
est un instance de l'attribut: chaqueClass
instance a sa propre copie.Class.a
est un attribut de classe: la classe elle-même a un seul exemplaire, peu importe la façon dont de nombreux cas, il y a (un peu comme un membre statique en C++ et langues apparentées). Et Si vous ne savez pas pourquoi vous voulez un attribut de classe, vous n'en voulez pas.Un nouvellement créé instance de
Class
n'a pas d'attributa
lorsque vous neinstance_of_class.method_2()
sans appelmethod_1
, comme dans votre exemple.Considérer cette légère altération de la version de votre code:
Chaque fois que vous appelez
Class()
(ouCreateNewClassInstance()
) vous pouvez créer une nouveau objet, avec son propre attributa
. Jusqu'à ce que vous initialiseza
, vous n'avez pas un attribut de même nom.La plupart du temps ce n'est pas un problème - mais,
+=
va tenter de chargerself.a
avant d'ajouter l'un - qu'est ce qui est à l'origine de votreAttributeError
dans ce cas.