Code-Stücke können hier veröffentlicht werden.
-
Tilltall
- User
- Beiträge: 6
- Registriert: Samstag 30. November 2019, 15:32
Samstag 30. November 2019, 15:38
Hallo zusammen,
ich bin noch ein ziemlicher Python Anfänger und weiß nicht so richtig wie ich meinen Code verändern muss um diesen Error loszuwerden. Vielleicht könnt ihr mir ja ein wenig unter die Arme greifen. Hier ist mein Code:
Code: Alles auswählen
class Drink:
"""
Klasse Drink
"""
def __init__(self, temperature):
"""
Parameter
Temperature: float
"""
self._temperature=temperature
def get_temperature(self):
"""Temperatur"""
return self._temperature
def drinkable(self):
"""Trinkbarkeit testen"""
if float(self._temperature)>=4 and float(self._temperature)<=50:
return True
else:
return False
temperature=property(get_temperature)
drinkable=property(drinkable)
d1 = Drink(14)
assert d1.drinkable()
-
__deets__
- User
- Beiträge: 9483
- Registriert: Mittwoch 14. Oktober 2015, 14:29
Samstag 30. November 2019, 15:44
Du musst die Klammern in der letzten Zeile loswerden. Das property das du da definiert hast (auf ungewöhnlich veraltete Art und Weise) liefert schon ohne Aufruf den Wert zurück.
-
Tilltall
- User
- Beiträge: 6
- Registriert: Samstag 30. November 2019, 15:32
Samstag 30. November 2019, 15:46
Danke dir für die schnelle Antwort. Problem ist ich darf die asserts nicht verändern. Die sind vorgegeben und ich muss meinen Code so verändern das die asserts funktionieren.
-
__deets__
- User
- Beiträge: 9483
- Registriert: Mittwoch 14. Oktober 2015, 14:29
Samstag 30. November 2019, 15:49
Also Hausaufgaben? Dann les dir nochmal meine Antwort durch - ich erwähne ja was dazu führt, das drinkable keine Methode ist. Wenn du dich mit dem Konzept in der Doku vertraut machst, kannst du auch erkennen, wie du es NICHT verwendest.
-
Tilltall
- User
- Beiträge: 6
- Registriert: Samstag 30. November 2019, 15:32
Samstag 30. November 2019, 16:19
Okay, ich verstehe leider nicht wirklich was du meinst und wie ich den Code ändern soll... Könntest du vielleicht ein wenig konkreter werden? Aber danke dir auf jeden Fall für deine Antworten!
-
snafu
- User
- Beiträge: 6311
- Registriert: Donnerstag 21. Februar 2008, 17:31
- Wohnort: Gelsenkirchen
Samstag 30. November 2019, 16:40
Einfach in der letzten Zeile nach "drinkable" die Klammern wegmachen:
Code: Alles auswählen
# Falsch
assert d1.drinkable()
# Richtig
assert d1.drinkable
Denn durch die Verwendung von property() wird die Rückgabe der Methode bereits beim Ansprechen des Propertys geliefert. Ein Aufruf würde sich dann auf die Rückgabe beziehen. Die ist aber ein Wahrheitswert und somit ihrerseits nicht mehr aufrufbar. Daher die Fehlermeldung.
In Code gesprochen gilt (zumindest hier):
Und dein Versuch wäre demnach:
Zuletzt geändert von
snafu am Samstag 30. November 2019, 16:43, insgesamt 1-mal geändert.
-
Tilltall
- User
- Beiträge: 6
- Registriert: Samstag 30. November 2019, 15:32
Samstag 30. November 2019, 16:41
Wie schon bereits erwähnt darf ich die asserts bei der Aufgabe nicht verändern. Daher muss es irgendwie möglich sein meine Code so zu verändern das es funktioniert.
-
snafu
- User
- Beiträge: 6311
- Registriert: Donnerstag 21. Februar 2008, 17:31
- Wohnort: Gelsenkirchen
Samstag 30. November 2019, 16:45
Die Lösung ist, dass du überhaupt kein property() brauchst. Greif doch einfach direkt auf das Attribut zu.
EDIT: Oder gib der Methode halt den anderen Namen, wenn es als Aufruf gewünscht ist.
Zuletzt geändert von
snafu am Samstag 30. November 2019, 16:48, insgesamt 1-mal geändert.
-
__deets__
- User
- Beiträge: 9483
- Registriert: Mittwoch 14. Oktober 2015, 14:29
Samstag 30. November 2019, 16:45
Ist es auch. Hast du dir wie vorgeschlagen die Dokumentation zu properties auf die ich hinwies durchgelesen? Was daran ist dir unklar?
-
__deets__
- User
- Beiträge: 9483
- Registriert: Mittwoch 14. Oktober 2015, 14:29
Samstag 30. November 2019, 16:47
@snafu: das assert darf nicht verändert werden, und stellt einen Methodenaufruf dar. UND das Attribut ist berechnet. Wie soll ‚ Greif doch einfach direkt auf das Attribut zu.‘ da Abhilfe schaffen?
-
Tilltall
- User
- Beiträge: 6
- Registriert: Samstag 30. November 2019, 15:32
Samstag 30. November 2019, 16:50
Alles klar jetzt hab ich es auch gechecked! Vielen lieben Dank euch für die schnelle und hiflreiche Lösung des Problems. Ich wünsche euch noch ein schönes restliches Wochenende!
-
snafu
- User
- Beiträge: 6311
- Registriert: Donnerstag 21. Februar 2008, 17:31
- Wohnort: Gelsenkirchen
Samstag 30. November 2019, 16:50
@Tilltall: Wie ich sehe, ist die drinkable()-Methode doch bereits definiert. Warum setzt du an der Stelle überhaupt ein property() ein? Was erhoffst du dir davon bzw was glaubst du, damit zu bewirken?
-
Tilltall
- User
- Beiträge: 6
- Registriert: Samstag 30. November 2019, 15:32
Samstag 30. November 2019, 16:52
Ich hatte generell für jeden getter ein property erstellt. Hab bei den asserts nicht gesehen das der Test die Methode schon direkt aufruft.