Erste OOP Versuche

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.
smoovn
User
Beiträge: 8
Registriert: Mittwoch 21. November 2007, 09:05

Erste OOP Versuche

Beitragvon smoovn » Montag 17. März 2008, 11:49

Hallo,

bei folgendem code:

Code: Alles auswählen

class Berechnung(object):
   
    def __init__(self, stdGearbeitet, stdLohn):
       
        self.__stdgearbeitet = stdGearbeitet
        self.__stdlohn = stdLohn
       
    def objGehalt(self):
      if self.__stdgearbeitet <= 0:
          print "Sie haben diesen Monat nicht Gearbeitet"
      elif self.__stdlohn <= 0 or self.__stdlohn == "":
          print "Uns liegt kein Stundenlohn vor, Sie bekommen den Mindestlohn gezahlt (11.50 EUR/Std)"
          self.__stdlohn = 8.50
          mongehalt = self.__stdgearbeitett * self.__stdlohn
          return mongehalt
      else:
          mongehalt = self.__stdgearbeitet * self.__stdlohn
          return mongehalt

b = Berechnung(85, 16)
b.objGehalt()
print mongehalt


wird mir dieser fehler ausgegeben:

Code: Alles auswählen

Traceback (most recent call last):
  File "D:\Python\Arbeitsplan\main.py", line 48, in <module>
    b.objGehalt()
  File "D:\Python\Arbeitsplan\main.py", line 27, in objGehalt
    print self.___stdgearbeitet
AttributeError: 'Berechnung' object has no attribute '_Berechnung___stdgearbeitet'


Nach meinem Verständniss hat stdgearebitet doch den wert von stdGearbeitet den ich ja beim Aufruf übergeben habe. Kann mir da jemand weiter helfen?


patrick
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Re: Erste OOP Versuche

Beitragvon helduel » Montag 17. März 2008, 12:33

smoovn hat geschrieben:

Code: Alles auswählen

Traceback (most recent call last):
  File "D:\Python\Arbeitsplan\main.py", line 48, in <module>
    b.objGehalt()
  File "D:\Python\Arbeitsplan\main.py", line 27, in objGehalt
    print self.___stdgearbeitet
AttributeError: 'Berechnung' object has no attribute '_Berechnung___stdgearbeitet'



Deine Variable hat in Wirklichkeit nur zwei Underscores und nicht drei.

Die Sache mit den doppelten Underscores solltest du dir aber nochmal überlegen. Die sollten eigentlich nur dann genommen werden, wenn man verhindern will, dass abgeleitete Klassen "versehentlich" eine bereits bestehende Variable überschreiben. Für "private" Member-Variablen verwendet man normalerweise nur ein Underscore vor dem eigentlichen Namen.

Ansonsten ist dein Code eher suboptimal ;-).

Fehlermeldungen gibt man in Objekten nicht mit print aus. Diese sollten Exceptions werfen. Die Exception kannst du dann abfangen und die eigentliche Fehlermeldung produzieren.

Deine Methode objGehalt: Zeilen 15, 16 und 18, 19 sind die gleichen (vom typo abgesehen). Die Berechnung reicht einmal am Ende.

Den Default-Wert für deinen Stundenlohn setzt du besser in der __init__-Methode. Die gearbeiteten Stunden würde ich als Argument in die objGehalt-Methode packen. Dann bleibt das Zeugs flexibel und du musst nicht ständig neue Objekte erzeugen, nur weil sich die gearbeiteten Stunden ändern.

In Zeile 22 rufst du deine Methode auf. Das "print mongehalt" wird nicht funktionieren, weil die mongehalt-Variable nur in deiner Methode lebt. Zeile 22 sollte also so lauten: mongehalt = b.objGehalt().

Das reicht vorerst mal ;-).
Benutzeravatar
Nicht_zu_definieren
User
Beiträge: 21
Registriert: Freitag 21. April 2006, 17:01
Kontaktdaten:

Beitragvon Nicht_zu_definieren » Montag 17. März 2008, 17:30

Code: Alles auswählen

print "Uns liegt kein Stundenlohn vor, Sie bekommen den Mindestlohn gezahlt (11.50 EUR/Std)"
          self.__stdlohn = 8.50


Dein Stundenlohn liegt bei 11.5 Euro, du hast 1 Stunde gearbeitet...macht dann 8.5*1=8.5 Euro Gesamtlohn...


Code: Alles auswählen

mongehalt = self.__stdgearbeitett * self.__stdlohn
return mongehalt


kann man durch

Code: Alles auswählen

return self.__stdgearbeitet * self.stdlohn


ersetzen.

Abgesehen davon solltest du dich mal einigen ob es __stdGearbeiet, __stdgearbeitet oder __stfgearbeitett heißt. (Kurzum: sei vorsichtig bei der Namenvergabe, aber halte dich an deine Namen und ändere sie nicht dauernd).

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]