LU12d - Property (erweitert)
Dieses Thema ist ein Blick in die Objektorientierte Programmierung im Modul 320.
Mit @property
und @attribut.setter
kann eine Klasse den Zugriff auf die Attribute kontrollieren.
Dieses Prinzip nennt sich Data Hiding
.
property und setter
... @property def firstname(self): return self._firstname @firstname.setter def firstname(self, value): self._firstname = value ...
Wenn wir eine Klasse programmieren, wollen wir das Lesen und Schreiben von Attributen kontrollieren. Die Kontrolle ob und wie die Werte der Attribute geändert werden können soll in der Hand der Klasse bleiben. Deshalb schreiben wir zu jedem Attribut eine Getter- und eine Setter-Methode.
Will ein andere Programmteil den Wert eines Attributs lesen, erfolgt dies über die sogenannte Getter
-Methode.
Diese Methode wird mit dem Decorator @property
definiert.
Im einfachsten Fall gibt diese Methode einfach den Wert des Attributs an den Aufrufer zurück.
Beachten Sie den Underscore vor dem Variablennamen, z.B. _firstname
In komplexeren Klassen werden einzelne Getter auch eine Verarbeitungslogik beinhalten. Für unsere Programme reichen aber einfache Getter.
Um den Wert eines Attributs zu ändern, stellt unsere Klasse eine Setter
-Methode bereit.
Diese Methode wird mit @attributname.setter
definiert.
Deren Aufgabe ist es, den Wert eines Attributs zu ändern.
Auch hier beschränken wir uns vorerst auf die Grundaufgabe: Nimm den value
und speichere ihn.
Beachten Sie den Underscore vor dem Variablennamen, z.B. _firstname
Um das Erstellen von property
und setter
zu vereinfachen, gibt es in PyCharm sogenannte „Live Templates“.
Eine kurze Anleitung zum Erstellen eines solchen Live Templates finden Sie unter https://it.bzz.ch/wikiV2/howto/pycharm/property
Die vollständige Klasse würde dann so aussehen:
- member.py
from dataclasses import dataclass @dataclass class Member: """ a club member """ firstname: str lastname: str address: str place: str zip_code: str entry_year: int birth_year: int honorary_member: bool @property def firstname(self): return self._firstname @firstname.setter def firstname(self, value): self._firstname = value @property def lastname(self): return self._lastname @lastname.setter def lastname(self, value): self._lastname = value @property def address(self): return self._address @address.setter def address(self, value): self._address = value @property def place(self): return self._place @place.setter def place(self, value): self._place = value @property def zip_code(self): return self._zip_code @zip_code.setter def zip_code(self, value): self._zip_code = value @property def birth_year(self): return self._birth_year @birth_year.setter def birth_year(self, value): self._birth_year = value @property def entry_year(self): return self._entry_year @entry_year.setter def entry_year(self, value): self._entry_year = value @property def honorary_member(self): return self._honorary_member @honorary_member.setter def honorary_member(self, value): self._honorary_member = value if __name__ == '__main__': test_person = Person() test_person.firstname = 'Hans' print(test_person)