Hallo Leute,
hier der Quelltext:
def ggt(a, b):
if (b == 0):
return a
else:
return ggt(b, (a % b))
class Bruch:
def __init__(self, zaehler=0, nenner=1):
self.z = zaehler
self.n = nenner
def __str__(self):
x = ggt(self.z,self.n)
self.z = self.z / x
self.n = self.n / x
return str(self.z) + "/" + str(self.n)
Folgendes Problem:
Ich möchte die Funktion ggt als Methode in die Klasse integrieren. Wenn ich sie so als Funktion vor der Klasse stehen habe, funktioniert sie. Sobald ich sie versuche als Methode einzufügen, auf die dann in __str__ zugegriffen werden kann, kommt "NameError: name 'ggt' is not defined".
Wie füge ich "ggt" am besten als Methode ein, sodass innerhalb der Klasse darauf zugegriffen werden kann?
Vielen Dank im Voraus.
Funktion in Klasse als Methode integrieren
Code bitte in Zukunft in die dazu gedachten code-tags stellen, damit die bei Python relevanten Einrueckungen erhalten bleiben.
Zum Thema: funktioniert fuer mich. Das Problem muss irgendwo anders liegen. Bitte den *vollstaendigen* Quellcode (du erzeugst ueberhaupt kein Bruch-Objegt, geschweige denn eine Ausgabe davon) zeigen, und die dazu gehoerende Fehelermeldung. Beides in Code-Tags!
Allerdings hat der Code eine Reihe von no-gos:
- man veraendert das Objekt nicht in als Seiteneffekt von __str__!!! Wenn du normalisieren willst, mach das im Konstruktor oder explizit.
- z/n als Attribute sind unnoetig kurz und konfus. Warum heissen die nicht zaehler/nennen?
- Strings formatiert man nicht mit +
Zum Thema: funktioniert fuer mich. Das Problem muss irgendwo anders liegen. Bitte den *vollstaendigen* Quellcode (du erzeugst ueberhaupt kein Bruch-Objegt, geschweige denn eine Ausgabe davon) zeigen, und die dazu gehoerende Fehelermeldung. Beides in Code-Tags!
Code: Alles auswählen
def ggt(a, b):
if (b == 0):
return a
else:
return ggt(b, (a % b))
class Bruch:
def __init__(self, zaehler=0, nenner=1):
self.z = zaehler
self.n = nenner
def __str__(self):
x = ggt(self.z,self.n)
self.z = self.z / x
self.n = self.n / x
return str(self.z) + "/" + str(self.n)
b = Bruch(100, 10)
print(b)
- man veraendert das Objekt nicht in als Seiteneffekt von __str__!!! Wenn du normalisieren willst, mach das im Konstruktor oder explizit.
- z/n als Attribute sind unnoetig kurz und konfus. Warum heissen die nicht zaehler/nennen?
- Strings formatiert man nicht mit +
Code: Alles auswählen
def ggt(a, b):
if (b == 0):
return a
else:
return ggt(b, (a % b))
class Bruch:
def __init__(self, zaehler=0, nenner=1):
self.zaehler = zaehler
self.nenner = nenner
def normalized(self): # Nicht modifizieren, sondern eine neue Instanz erzeugen!
divisor = ggt(self.zaehler, self.nenner)
return Bruch(self.zaehler / divisor, self.nenner / divisor)
def __str__(self):
return f"{self.zaehler}/{self.nenner}"
b = Bruch(100, 10)
print(b)
print(b.normalized())
Danke für deine Antwort und den Hinweisen. Setze ich so um.
Mir ist klar, dass es so mit der Funktion funktioniert, allerdings ist es eine Aufgabe aus meinem Studium "ggt" als Methode und nicht als Funktion zu erstellen.
Mir ist klar, dass es so mit der Funktion funktioniert, allerdings ist es eine Aufgabe aus meinem Studium "ggt" als Methode und nicht als Funktion zu erstellen.
Dann musst du zeigen, was du wirklich gemacht hast. Und Methoden ruft man immer mit Bezug auf das Objekt auf. Also von aussen mit
und innehalb natuerlich mit self
Code: Alles auswählen
mein_objekt.methode(...)
Code: Alles auswählen
self.methode(...)
Den ggT als Methode von Bruch (rationale Zahl) zu definieren, halte ich für Unsinn. Die ggT-Funktion bildet ein Paar ganze Zahlen auf eine natürliche Zahl ab und ist keine Operation der rationalen Zahlen. So ist der ggT für (a, 0) definiert, a/0 jedoch keine rationale Zahl.
Die von __deets__ angeführte normalized-Funktion nutzt die ggT-Funktion.
Aber Aufgabe ist bekanntlich Aufgabe.
Die von __deets__ angeführte normalized-Funktion nutzt die ggT-Funktion.
Aber Aufgabe ist bekanntlich Aufgabe.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"