OOP Summe mit beliebigen Zahlen

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
Steinadler92
User
Beiträge: 5
Registriert: Montag 4. April 2016, 14:37

Hallo,

ich bin neu in der Python-Programmierung und mir ist bewusst, dass mir hier nicht meine Hausaufgaben gemacht werden. :wink:
Aber für folgendes Problem finde ich nach langer Recherche einfach keinen Lösungsansatz:

Meine Aufgabe besteht darin, eine Klasse mit den Attributen "a", "b" und "ergebnis" zu erstellen.
Dabei soll eine Methode soweit angepasst werden, dass die Attribute "a" und "b" addiert und im Attribut "ergebnis" abgespeichert werden sollen.
Außerdem soll eine Methode für eine Ausgabe des Ergebnisses erstellt werden...
Funktional soll der Nutzer die Möglichkeit haben, die Zahlen für die Attribute "a" und "b" zu bestimmen.
Nach der Eingabe des Nutzers sollen die Methoden zur Berechnung und Ausgabe ausgeführt werden..

Bisher habe ich folgendes:

Code: Alles auswählen

class Berechnung():
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self.ergebnis = 0
        
    def summe(self):
        self.ergebnis = self.a + self.b
...
Jetzt meine Frage:

Wie kann ich so eine Funktion erstellen, die dem Nutzer die Möglichkeit gibt, die Attribute zu bestimmen?

LG Lars
Zuletzt geändert von Anonymous am Montag 4. April 2016, 15:29, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
BlackJack

@Steinadler92: Du nimmst die `raw_input()`-Funktion (Python 2) oder die `input()`-Funktion (Python 3) und die `float()`-Funktion und lässt damit den Benutzer zwei Eingaben machen, die Du in Zahlen umwandelst. Und damit rufst Du dann die Klasse auf um ein Objekt mit diesen Werten zu erzeugen.

Das Beispiel ist übrigens sehr schlecht. OOP macht hier keinen Sinn und OOP ist kein Selbstzweck. Damit ist das auch gar keine OOP sondern einfach nur Funktionen in eine Klasse gesteckt. Zudem hängen die Attribute voneinander ab, das heisst das `ergebnis` ist redundant und bräuchte nicht gespeichert zu werden. Wenn man es speichert, dann sollte man dafür sorgen das die Werte immer zusammen passen. Wenn man irgendwelche Zahlen für `a` und `b` angibt, deren Summe nicht 0 ergibt, dann ist das Objekt direkt nach dem erstellen in einem illegalen Zustand. Das ist Murks.
Steinadler92
User
Beiträge: 5
Registriert: Montag 4. April 2016, 14:37

Guten Morgen,

danke für die schnelle Antwort! :)
Der input()-Befehl wäre jetzt auch meine nächste Option gewesen. ;)
Das an diesem Beispiel OOP sinnlos ist, ist egal ;) . Wir sollen einfach nur mal eine Klasse mit Attributen und Methoden erstellen, es dient jediglich nur als Übung, was wir im "Selbststudium" herausfinden sollen.

LG
Steinadler92
User
Beiträge: 5
Registriert: Montag 4. April 2016, 14:37

So sieht jetzt meine Lösung der Übung aus:

Code: Alles auswählen

class Berechnung():
    def __init__(self):
        
        self.a = 0
        self.b = 0
        self.ergebnis = 0
        
    def summe(self):
        self.ergebnis = self.a + self.b

c = Berechnung()
c.a=(float(input('Gib einen Wert fuer a ein: ')))
c.b=(float(input('Gib einen Wert fuer b ein: ')))

c.summe()
print(c.ergebnis)
LG & danke für den Hinweis :)
BlackJack

Noch mal an (später) mitlesende, weil WICHTIG: Das ist keine objektorientierte Programmierung!

@Steinadler92: Die Namen `c` und `summe` sind schlecht gewählt. `c` sagt dem Leser nichts darüber was das für ein Wert ist. Da das ja alles generisch benannt ist, wäre `berechnung` ein Name der zwar auch recht generisch ist, aber deutlich besser als ein einzelner Buchstabe ohne jegliche Bedeutung. `summe` ist schlecht weil sich dahinter keine Summe verbirgt, sondern eine Methode die eine Summe berechnet. Funktionen und Methoden werden üblicherweise nach Tätigkeiten benannt, damit man sie von eher passiven Werten besser unterscheiden kann. Also `addiere()` oder `berechne()` wäre besser. Wenn man sie `addiere()` nennt, könnte man auch überlegen ob man die Klasse nicht treffender `Addition` nennt. Und `c` dann auch `addition`.

Anstelle von 0en würde ich die Attribute mit `None` initialisieren. Dann fällt beim Aufruf der Berechnungsmethode auf wenn nicht alle nötigen Attribute gesetzt wurden, und beim Abfragen vom Ergebnis fällt auf wenn es noch nicht berechnet wurde.

Warum bist Du von der ersten Signatur der `__init__()` abgerückt?

Die Klammern um die kompletten Ausdrücke bei den Zuweisungen von `a` und `b` sind überflüssig.
Steinadler92
User
Beiträge: 5
Registriert: Montag 4. April 2016, 14:37

Ich habe das Ganze nochmal angepasst:

Code: Alles auswählen

class Addition():
    def __init__(self):
        
        self.a = None
        self.b = None
        self.ergebnis = None
        
    def addiere(self):
        self.ergebnis = self.a + self.b

berechnung = Addition()
berechnung.a=float(input('Gib einen Wert fuer a ein: '))
berechnung.b=float(input('Gib einen Wert fuer b ein: '))

berechnung.addiere()
print(berechnung.ergebnis)
BlackJack hat geschrieben:Warum bist Du von der ersten Signatur der `__init__()` abgerückt?
Was meinst du damit? :)

LG
BlackJack

@Steinadler92: Im ersten Beitrag sei Deine `__init__()` noch anders aus. Die hatte den Vorteil das man sich bei den Attributen `a` und `b` keine Gedanken über einen ”vorläufigen” Wert für die Initialisierung machen musste.
Steinadler92
User
Beiträge: 5
Registriert: Montag 4. April 2016, 14:37

Achso okay. Wenn ich es so mache:

Code: Alles auswählen

class Addition():
    def __init__(self, a,b):
...
dann meckert er:

TypeError: __init__() missing 2 required positional arguments: 'a' and 'b'

LG
BlackJack

@Steinadler92: Nur wenn Du die Werte für `a` und `b` nicht übergibst.
Antworten