====== 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: 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)