Funktion in Klasse als Methode integrieren

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
szammy
User
Beiträge: 2
Registriert: Donnerstag 16. Februar 2023, 10:48

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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!

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)
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 +

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())
szammy
User
Beiträge: 2
Registriert: Donnerstag 16. Februar 2023, 10:48

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann musst du zeigen, was du wirklich gemacht hast. Und Methoden ruft man immer mit Bezug auf das Objekt auf. Also von aussen mit

Code: Alles auswählen

mein_objekt.methode(...)
und innehalb natuerlich mit self

Code: Alles auswählen

self.methode(...)
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

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.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten