Seite 1 von 1

Erste OOP Versuche

Verfasst: Montag 17. März 2008, 11:49
von smoovn
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

Re: Erste OOP Versuche

Verfasst: Montag 17. März 2008, 12:33
von helduel
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 ;-).

Verfasst: Montag 17. März 2008, 17:30
von Nicht_zu_definieren

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