3
votes

Qu'est-ce qui cause une erreur AttributeError avec mon code Python lorsque je le compile?

J'essaie d'écrire du code qui me permette de transmettre un nombre qui augmente ou diminue dans ma classe Square. Lors de la compilation du code, je reçois cette erreur:

>>> print(a_square.s1)
100

>>> a_square.change_size(200)

Code entré:

class Square():
    def __init__(self,s1):
        self.s1=s1


def calculate_perimeter(self):
    return self.s1*4

def change_size(self,new_size):
    self.s1+=new_size


a_square= Square(100)

Interaction:

AttributeError: 'Square' object has no attribute 'change_size'. 


1 commentaires

J'ai extrait votre code saisi à la main (ce n'est pas un moyen fiable de créer des classes) lorsque vous l'avez publié. À partir de là, le problème est évident: change_size est en dehors de Square . Vous devez corriger votre indentation. Je recommande de mettre ce code dans un fichier.


3 Réponses :


2
votes

Le code que vous avez publié ci-dessus a-t-il une indentation identique à votre code réel? Si tel est le cas, le problème est probablement dû au fait qu'en Python, l'indentation est vraiment importante. C'est-à-dire:

class Square():
def init(self, s1):
self.s1 = s1
.
.
.

n'est pas la même chose que

class Square():
    def init(self, s1):
        self.s1 = s1
        .
        .
        .

Vous pouvez voir une explication plus longue et plus d'exemples dans le Guide de style PEP8 .


0 commentaires

0
votes

Veuillez changer l'indentation,

a_square.s1
100

a_square.change_size(100)

200

Résultat:

class Square():
    def __init__(self,s1):
        self.s1=s1
    def calculate_perimeter(self):
        return self.s1*4
    def change_size(self,new_size):
        self.s1+=new_size
        return self.s1
a_square= Square(100)

S'il vous plaît laissez-moi savoir si vous avez des questions, je serais très heureux de vous aider.


2 commentaires

Ok, je viens d'essayer et cela semble avoir fonctionné. Merci beaucoup!


Sûr. Aucun problème. Si cela vous aide, veuillez marquer cette réponse comme bonne réponse.



0
votes

Peu de choses:

1) utilisez les blocs de formatage du code pour vous aider à rendre votre code plus lisible

2) supprimez le + = lorsque vous modifiez la taille de l'attribut car un opérateur d'affectation augmentée ajoutera la valeur à la valeur existante

3) établir l'attribut s1 avant de l'utiliser dans la classe

Essayez quelque chose comme:

class Square():
    s1 = 0
    def init(self,s1): 
        self.s1=s1

    def calculate_perimeter(self):
    return self.s1*4

    def change_size(self,new_size): 
        self.s1 = new_size

a_square = Square()

print(a_square.calculate_perimeter())

a_square.change_size(5)

print(a_square.calculate_perimeter())


0 commentaires