Seite 1 von 1

object has no attribute

Verfasst: Sonntag 10. Mai 2020, 17:27
von rakai002
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'

Re: object has no attribute

Verfasst: Sonntag 10. Mai 2020, 19:03
von __blackjack__
@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()