Seite 1 von 1

Funktion in Klasse als Methode integrieren

Verfasst: Donnerstag 16. Februar 2023, 10:57
von szammy
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.

Re: Funktion in Klasse als Methode integrieren

Verfasst: Donnerstag 16. Februar 2023, 11:29
von __deets__
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())

Re: Funktion in Klasse als Methode integrieren

Verfasst: Donnerstag 16. Februar 2023, 11:48
von szammy
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.

Re: Funktion in Klasse als Methode integrieren

Verfasst: Donnerstag 16. Februar 2023, 11:50
von __deets__
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(...)

Re: Funktion in Klasse als Methode integrieren

Verfasst: Donnerstag 16. Februar 2023, 15:22
von bwbg
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.