Syntax-Fehler bei if-Schleife - ratlos trotz Musterlösung

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
ScottyMiller
User
Beiträge: 12
Registriert: Freitag 14. August 2020, 13:06

Hallo zusammen,

ich sitze an der Prüfungsvorbereitung für Grundlagen Softwaretechnik. Gelehrt wird Python. Die Aufgabe an der ich aktuell sitze ist folgende:

Es sollen die Klassen Saeugetier und Mensch programmiert werden. Die Klasse Saeugetier hat die Eigenschaft "geschlecht", welches mit einem Dekorateur programmiert werden soll. Für das "geschlecht" sollen w, m oder d akzeptiert werden, sonst erhält "geschlecht" den Wert "x".

Die Klasse Mensch soll von der Klasse Saeugetier erben. Die schreibgeschützte Property anrede soll für das Geschlecht "w" den String "Liebe", für "m" "Lieber" und für "d" nur den Namen ausgeben.

Ich habe folgenden Code programmiert und ihn mit der in der Übung erarbeiteten Lösung überprüft. Laut Musterlösung sollte der Code funktionieren:

Code: Alles auswählen

#Übung 10 - Säugetier und Mensch

class Saeugetier:
    
    def __init__(self, geschlecht):
        
        self.geschlecht = geschlecht
        
        @property
        def geschlecht (self):
            return self.__geschlecht
        
        @geschlecht.setter
        def geschlecht(self, geschlecht):
            
            self.geschlecht = "x"
            
            if isinstance (geschlecht, str):
                
                g == geschlecht.lower()
                
            if g == "m" or g == "w" or g == "d":
                self.geschlecht = g
            
            return self.__geschlecht
        
class Mensch (Saeugetier):
    
    def __init__(self, geschlecht, name):
        
        self.name = name
        super().__init__(geschlecht)
        
    @property
    def anrede(self):
    
        ar = none
    
        if self.geschlecht = "w": 
            
            ar = "Liebe" + self.name
        
        elif self.geschlecht = "m": 
            
            ar = "Lieber" + self.name
        
        elif self.geschlecht = "d": 
            
            ar = self.name
    
    return ar

In Zeile 39 wird der Fehler "SyntaxError: invalid syntax" angezeigt. Dabei ist die if-Schleife doch eigentlich so richtig programmiert?

Ich würde mich sehr freuen, wenn man mir den Fehler erklären könnte. Auch, wenn es Fehler in der Funktionalität geben sollte.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

http://if-schleife.de

In Zukunft bitte immer die vollständige Fehlermeldung posten. Man hat dann weniger zu raten.

In deinem Fall geht es um den Unterschied zwischen Zuweisung und Vergleich. Also = vs ==. Schau dir das mal an.
ScottyMiller
User
Beiträge: 12
Registriert: Freitag 14. August 2020, 13:06

Ich arbeite aktuell mit Thonny, da war das die vollständige Fehlermeldung. Ich werde aber drauf achten.

Habe die if-Abfrage ( :D ) dahingehend geändert und der Code funktioniert ohne Probleme. Vielen Dank!

Ich frage mich trotzdem, warum das in der Übung auf dem PC des Profs. genau so funktioniert hat...
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

ScottyMiller hat geschrieben: Sonntag 21. Februar 2021, 11:26 Ich frage mich trotzdem, warum das in der Übung auf dem PC des Profs. genau so funktioniert hat...
Da in dem Beispielcode und der Aufgabe so einiges vorkommt, was man in Python normalerweise eigentlich eher nicht machen würde, drängt sich der Verdacht auf, dass das vielleicht gar kein Python war, was der Professor dort verwendet hat … :twisted: ;)
Zuletzt geändert von nezzcarth am Sonntag 21. Februar 2021, 11:38, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@ScottyMiller: Hat er nicht. Garantiere ich dir.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@ScottyMiller: in der Klasse `Saeugetier` ist einiges falsch eingerückt. Einrückungen sind in Python so wichtig, dass wenn man das nicht beherrscht, man eigentlich gar kein Python kann.
Vergiss, dass es sowas wie doppelte Unterstriche überhaupt gibt, das ist so gut wie nie nötig, und hier auch nicht.
Im Setter geschlecht hast Du eine unnötige Typprüfung. Zum einen, weil bei falschem Typ Du einen UnboundLocalError bekommst, zum anderen, weil man nicht jeden Fall explizit abprüfen muß. Wenn jemand etwas anderes als einen String zuweist, sollte es eine Exception geben, und da ist der AttributeError klar genug. Setter haben keinen Rückgabewert.

Benutze keine Abkürzungen, g oder ar sind nichtssagent und verwirrend. Strings setzt man nicht mit + zusammen und das Ergebnis soll bestimmt nicht "LiebeAnna" sein.

Code: Alles auswählen

class Saeugetier:
    
    def __init__(self, geschlecht):
        self.geschlecht = geschlecht
        
    @property
    def geschlecht (self):
        return self._geschlecht
    
    @geschlecht.setter
    def geschlecht(self, geschlecht):
        geschlecht = geschlecht.lower()
        self._geschlecht = geschlecht if geschlecht in ('m', 'w', 'd') else 'x'
        
class Mensch(Saeugetier):
    def __init__(self, geschlecht, name):
        super().__init__(geschlecht)
        self.name = name
        
    @property
    def anrede(self):
        form = {
            "w": "Liebe {}",
            "m": "Lieber {}",
            "d": "{}",
        }
        return form[self.geschlecht].format(self.name)
ScottyMiller
User
Beiträge: 12
Registriert: Freitag 14. August 2020, 13:06

__deets__ hat geschrieben: Sonntag 21. Februar 2021, 11:38 @ScottyMiller: Hat er nicht. Garantiere ich dir.
Ich finde sowas ja immer wieder überraschend. Der Prof. schreibt bei uns zwar die Lösungen handschriftlich auf seinem iPad, aber er geht ja auch von seinen Musterlösungen aus. Sprich: Er wird das ja so oder so ähnlich mal programmiert haben. Ich habe aber bei mir im Unternehmen auch schon ITler zu einigen Sachen gefragt und wie sehr sich die Lösungsvorschläge oder der Code von denen unterscheidet, das lässt mich immer verblüfft zurück. Vor allem da ich als Rookie sowas einfach auch nicht "besser weiß".
Sirius3 hat geschrieben: Sonntag 21. Februar 2021, 12:16 @ScottyMiller: in der Klasse `Saeugetier` ist einiges falsch eingerückt. Einrückungen sind in Python so wichtig, dass wenn man das nicht beherrscht, man eigentlich gar kein Python kann.
Vergiss, dass es sowas wie doppelte Unterstriche überhaupt gibt, das ist so gut wie nie nötig, und hier auch nicht.
Im Setter geschlecht hast Du eine unnötige Typprüfung. Zum einen, weil bei falschem Typ Du einen UnboundLocalError bekommst, zum anderen, weil man nicht jeden Fall explizit abprüfen muß. Wenn jemand etwas anderes als einen String zuweist, sollte es eine Exception geben, und da ist der AttributeError klar genug. Setter haben keinen Rückgabewert.

Benutze keine Abkürzungen, g oder ar sind nichtssagent und verwirrend. Strings setzt man nicht mit + zusammen und das Ergebnis soll bestimmt nicht "LiebeAnna" sein.
Ich bedanke mich vielmals. Einrückungen sollte ich mir dringend anschauen, das merke ich immer wieder.
Ich kann immer nur von dem ausgehen, was der Prof. uns beibringt, was in seinem Skript oder seinen Empfehlungen so steht. Und ich muss auch einfach zugeben, dass ich die Transferleistung einfach nicht habe, den Code vom Prof. so anzuzweifeln und anders zu schreiben.

Das mit den Abkürzungen und Bezeichnern, die er so in seinen Aufgaben vorgibt und verwendet, sehe ich genau so. Oft hat er auch seine Listen mit "lst" benannt statt der Liste einen sinnvollen Namen zu geben. Und in Klausuren gibt er die Bezeichner vor, was mich auch wieder verwirren wird.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ScottyMiller: Nein, Profs müssen das nicht so oder so ähnlich programmiert haben, vor allem nicht in der Programmiersprache in der sie Dir das da gerade präsentieren. Einigen reicht es zu wissen wie das ungefähr funktionieren würde und die schreiben dann irgend etwas ähnliches auf/an die Tafel/den Beamer/die Folien. Also direkt den Code aus dem Kopf, ohne den auszuprobieren oder wenigstens mal einem Compiler zum prüfen der Syntax zu geben. Es gibt auch einige die OOP ”praktisch” immer nur an den üblichen Spielzeugbeispielen selbst ”erlebt” haben. Und die *müssen* nach Lehrplan auch ein paar Sachen durchnehmen, wie ”private”, die es in Python so gar nicht gibt. Und diese komische mentale Gehirnakrobatik das ein ”privates” Attribut das triviale Getter und Setter hat irgendwie besser gekapselt sei als wenn das einfach als Attribut öffentlich zugreifbar wäre.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten