object has no attribute

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rakai002
User
Beiträge: 1
Registriert: Sonntag 10. Mai 2020, 17:15

hi zusammen :)
ich bringe mir grade selber python bei und habe eine eine fehlermeldung bekommen die ich allerdings nicht nachvollziehen kann. bzw. ich bin der meinung das ich alles richtig gemacht habe
hier mein code:


#gespeichert als class_stundent.py
#****************************************************************

class student:
def __init__(self, name, major, gpa): # student
self.name=name
self.major=major
self.gpa=gpa

def on_honor_roll(self): #object is passed
if self.gpa >= 3.5:
return True
else:
return False
#****************************************************************

#gespeichert als add2.py
#****************************************************************
from class_student import student

student1 = student("jim","business",3.1)
student2 = student("pam","art",3.8)

print(student1.on_honor_roll())

#****************************************************************


Meine Fehlermeldung:

Traceback (most recent call last):
File "app.py", line 11, in <module>
print(student1.on_honor_roll())
AttributeError: 'student' object has no attribute 'on_honor_roll'
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rakai002: Das sollte eher nicht in zwei Modulen stehen. Eine Datei pro Klasse ist eher Java, aber kein Python.

Klassennamen schreibt man „MixedCase“, also `Student`. Namen sollte man nicht nummerieren. Dann will man entweder bessere Namen verwenden, oder gar keine einzlenen Namen sondern eine Datenstruktur. Oft eine Liste.

Das Problem ist eigentlich recht eindeutig: `student`-Objekte haben wie die Ausnahme sagt, kein `on_honor_roll`-Attribut. Deine Klasse hat nur eine `__init__()`-Methode. Und danach definierst Du eine Funktion auf Modulebene. Das sollte auch eine Methode *in* der Klasse sein. Einrückung hat eine Bedeutung in Python. Die entscheidet darüber zu welchem Block Code gehört, also zum Beispiel was alles *in* der Klasse definiert ist, und was nicht mehr.

Die `on_honor_roll()`-Methode ist ein bisschen ausschweifend. Die ``if``-Bedingung wird doch schon zu einem Wahrheitswert ausgewertet. Den kann man auch zurückgeben.

Code: Alles auswählen

#!/usr/bin/env python3


class Student:
    def __init__(self, name, major, gpa):
        self.name = name
        self.major = major
        self.gpa = gpa

    def on_honor_roll(self):
        return self.gpa >= 3.5


def main():
    students = [Student("jim", "business", 3.1), Student("pam", "art", 3.8)]

    for student in students:
        print(student.on_honor_roll())


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten