Seite 1 von 1
__le__
Verfasst: Donnerstag 1. Dezember 2022, 09:45
von xocy
hallo,
ich weiss ich muss den vergleich mit __le__ einbauen. ich finde dazu leider nichts hilfreiches nur vergleiche fuer attribute. wonach muesste ich ausschau halten.
lg
Code: Alles auswählen
class Cookies:
def __init__(self, max):
self.max = max
self.n= 1
def count(self):
if self.n <= self.max:
print(f"Ich essse keks nummer {self.n}. yummy yummy")
self.n += 1
return self.n
else:
print("ich platze gleich :O nein nein")
test = Cookies(100)
if test.count() <= Cookies(100):
print(test.count())
Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 09:55
von Sirius3
Was soll den das Ergebnis eines solchen Vergleichs sein? Das ist irgendwie ein Äpfel mit Birnen Vergleichen, oder hier Count mit Cookies: macht keinen Sinn.
Der Name `count` ist etwas verwirrend, weil da nichts gezählt wird, sondern ein Zähler verändert wird. Eine Funktion sollte entweder in keinem Fall einen Returnwert haben, oder immer. Bei Dir ist im if-Block ein return im else-Block aber nicht. Das ist mit Sicherheit ein Programmfehler.
Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 09:57
von noisefloor
Hallo,
was ist denn der Sinn des ganzen? Die Instanz einer Klasse mit einem Wert in irgendeiner Form zu vergleichen zu wollen ist erst mal ungewöhnlich. Außerdem liefert count() bei dir einen Integer oder None. Damit lässt sich ein Größenvergleich schlecht implementieren.
Gruß, noisefloor
Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 10:34
von xocy
hallo,
es sollten solange kekse gefuttert werden bis 100 erreicht waeren. rueckblickend betrachtet sieht das ganze doch recht wirr aus.
lg
Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 10:58
von noisefloor
Hallo,
und warum implementierst du die Abfrage "100 Kekse gefuttert" nicht in die Klasse selbst? Warum willst du nur den externen Vergleich?
Gruß, noisefloor
Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 10:58
von __deets__
Also ich wuerde das so angehen:
Code: Alles auswählen
class Magen:
def __init__(self):
self._kekse = 0
def __le__(...) # deine Aufgabe
def keks_essen(self):
self._kekse += 1
magen = Magen()
while magen < 100:
magen.keks_essen()
Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 11:12
von imonbln
__deets__ hat geschrieben: Donnerstag 1. Dezember 2022, 10:58
Ein kleiner Typo __le__ ist less_equal du vergleichst aber hier __lt__, da wird sich der Interpreter beschweren, dass er nicht zwischen Magen und Int ein "<" machen kann.
Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 11:41
von __blackjack__
Also ich finde es ja auch komisch einen Magen mit einer Zahl zu vergleichen. Das liest sich doch auch total schräg. Was sollen denn die konkreten Randbedingungen sein? Warum tut es nicht eine einfache Schleife?
Code: Alles auswählen
for keks_nummer in range(1, 101):
print(f"Ich esse 🍪 Nummer {keks_nummer}. Yummy yummy.")
Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 12:54
von __deets__
Ich denke hier gehts um die Möglichkeit, Vergleichssemantik für eigene Typen zu verstehen. Natürlich ist das etwas konstruiert.
Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 13:10
von __blackjack__
Dass das irgendwie einen Lerneffekt haben soll war mir schon klar, aber es ist halt ein wirklich schlechtes Beispiel. Und so ähnlich wie es beim lernen von Klassen auch dazugehört wann man keine Klasse schreibt, sollte man hier IMHO deutlich sagen, dass man das so nicht macht.
Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 13:11
von xocy
ja mir ist auf dem weg zum einkaufen eingefallen, das es vermutlich besser so zu verstehen ist.
Code: Alles auswählen
class Cookies:
def __init__(self, max):
self.max = max
self.n= 1
def __iter__(self):
return self
def __next__(self):
if self.n <= self.max:
res = self.n
self.n += 1
return res
else:
raise StopIteration
def __le__(self):
return self
test = Cookies(100)
while test <= Cookies:
print(next(test))
else:
print("ich werde dick :O")
edit: ein einfaches return self hat das problem geloest danke trotzdem
lg
Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 14:04
von __deets__
Das ist Quatsch-Code. test <= Cookies ist falsch, und liefert
Code: Alles auswählen
Traceback (most recent call last):
File "/tmp/test.py", line 24, in <module>
while test <= Cookies:
TypeError: Cookies.__le__() takes 1 positional argument but 2 were given
Und self zurueckzugeben ist auch Unfug, denn das ist immer wahr (ohne weiter Massnahmen, und die waeren auch nicht angezeigt).
Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 15:07
von __blackjack__
@xocy: Nimm einfach wie gezeigt eine ``for``-Schleife und `range()` oder überlege Dir ein wenigstens ansatzweise sinnvolles Beispiel. Sonst lernt man nicht wie man es richtig macht.
Was an sich schon mal nicht sinnvoll ist, oder nur in wirklich seltenen Fällen, ist der Vergleich von so unterschiedlichen Typen mittels ``<`` & Co. Wo man dann übrigens eigentlich auch wirklich alle Operatoren haben möchte, denn wenn ``a <= b`` funktioniert, erwartet der Leser das auch ``<``, ``>``, ``>=``, ``==``, und ``!=`` konsistent dazu funktionieren. Und wenn man ``==`` implementiert, sollte man auch `__hash__()` implementieren, um den nächsten unliebsamen Überraschungen entgegen treten zu können. Und wenn einem das für den Anfang alles noch zu kompliziert ist: Einfach erst einmal anderes lernen. Das man die Vergleichsoperatoren überladen will, kommt gar nicht so oft vor. Wenn dann in der Regel auch nur bei Werttypen und nicht bei Objekten mit veränderlichem Zustand. Und wenn Objekte mit veränderlichem Zustand, dann sind die relativen Vergleichsoperatoren in der Regel nur auf einer unveränderlichen Untermenge des Zustands definiert. Also so wirklich gar nicht was *hier* versucht wird. Wenn das wirklich mal Sinn macht, dann kann man sich damit einmal auseinandersetzen — und dann das `attrs`-Package verwenden um (auch) solche Klassen zu schreiben, so dass man sich damit nie wieder beschäftigen muss.

Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 15:27
von __blackjack__
Um das mit den Keksen mal sinnvoller zu modellieren:
Code: Alles auswählen
#!/usr/bin/env python3
from itertools import count
class CookieEater:
def __init__(self, capacity):
self.capacity = capacity
self.cookie_count = 0
def is_full(self):
return self.cookie_count >= self.capacity
def eat_cookie(self):
if self.is_full():
raise ValueError("already full")
self.cookie_count += 1
def main():
me = CookieEater(10)
for cookie_number in count(1):
if me.is_full():
print("Ich platze gleich :O")
break
print(f"Ich esse Keks Nummer {cookie_number}. Yummy yummy.")
me.eat_cookie()
if __name__ == "__main__":
main()
Re: __le__
Verfasst: Donnerstag 1. Dezember 2022, 16:12
von xocy
ich wollte es anders mal probieren als mit for und range. ich sehe schon dafuer fehlt mir noch etwas wissen. ich werde mir einfach was neues suchen und dort weiter lernen danke.
lg