@Dosi: Das mit den doppelten Unterstrichen ist Unsinn. Man kommt trotzdem problemlos an die Werte von aussen dran. ”Komplette Kapselung” gibt es in dem Sinne in Python nicht. Zumal wenn man Getter und Setter hat, man auch keine Kapselung hat, denn dann kommt man ja sowieso an die Werte. Ist halt nur wesentlich mehr unnütze schreibarbeit auf beiden Seiten. Wie gesagt, dass sieht aus als wollte da jemand Java-Eigenschaften und Java-Denke in Python pressen. Das ist falsch. Wer eine Sprache mit erzwungenem Zugriffsschutz will, soll halt eine Sprache wählen die das bietet und nicht eine nehmen die das *explizit nicht* bietet. In Python gibt es die Konvention das Implementierungsdetails durch *einen* führenden Unterstrich gekennzeichnet werden. Doppelte führende Unterstriche sind dazu da um Namenskollisionen bei tiefen Vererbungshierarchien und Mehrfachvererbung zu verhindern — beides wird *sehr* selten eingesetzt. Triviale, prophylaktische Getter und Setter wie beispielsweise in Java sind „unpythonisch“ weil es `property()` gibt und man sich den Mehraufwand deshalb sparen kann.
Du solltest in dem Professor keinen neuen Mitarbeiter erstellen, der Professor *ist* ja ein Mitarbeiter, sondern die `__init__()` von Mitarbeiter aufrufen, mit dem Professor als Argument. Danach sind dann ja auch die Attribute definiert. Also wenn man sie ohne diese unsinnigen doppelten Unterstriche definiert hat. Sonst muss man über die Getter und Setter gehen, und da sieht man dann auch schön warum die so unsinnig sind.
Ich ahne übrigens gerade was ganz Böses™: das `_pr` bei den Settern soll nicht zufällig für ”protected” stehen? Dann ist Python wirklich, ganz ehrlich, die gänzlich falsche Programmiersprache. Denn ”protected” gibt es noch weniger als ”private”. Das ist einfach nur noch pervers so etwas in Python lehren zu wollen. Mit Künstlerpinseln und Ölfarbe wird man ja auch nicht technisches Zeichnen lernen.
Die `Mitarbeiter.__str__()`-Methode ist ”falsch”. Das sieht eher wie eine Implementierung der `__repr__()`-Methode aus, allerdings sollte das dann nicht wie ein Aufruf ausehen, denn `Mitarbeiter` kann man ja gar nicht mit zwei Argumenten aufrufen! In solchen Fällen ist die Konvention das die `__repr__()`-Darstellung mit '<' und '>' eingefasst wird.
In Python könnte so etwas so aussehen:
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
class Mitarbeiter(object):
def __init__(self):
self.name = 'N.N.'
self.gehalt = 1500
def __repr__(self):
return (
'<{0.__class__.__name__} name={0.name!r} gehalt={0.gehalt!r} {1:x}>'
.format(self, id(self))
)
class Professor(Mitarbeiter):
def __init__(self, name):
Mitarbeiter.__init__(self)
self.name = name
self.gehalt *= 3
def main():
for mitarbeiter in [Mitarbeiter(), Professor('Peng')]:
print(mitarbeiter)
if __name__ == '__main__':
main()
Ausgabe:
Code: Alles auswählen
<Mitarbeiter name='N.N.' gehalt=1500 b726c72c>
<Professor name='Peng' gehalt=4500 b726c76c>