291
10.4
Zugriff auf Attribute – Sichtbarkeit
Wenn Sie dieses Modul mit der Klassendefinition einmal haben laufen lassen, können Sie
es in der Python-Shell im interaktiven Modus testen:
Hinweis:
In den Beispielprogrammen dieses Buches werden in der Regel öffentliche Attribute ver-
wendet, obwohl dies eigentlich kein guter Programmierstil ist. Der Grund liegt darin, dass
die Beispiele so kurz wie möglich sein sollen, damit man sie besser nachvollziehen kann. Bei
privaten Attributen müssten zusätzliche
set- und get-Methoden definiert werden. Das
macht den Programmtext zwar besser und sicherer aber auch länger.
10.4.3 Properties
Python bietet eine Möglichkeit, Attribute so zu definieren, dass man auf sie von außen
scheinbar direkt zugreifen kann, der Zugriff aber von speziellen, in der Klasse definierten
Methoden kontrolliert wird. Dazu definieren Sie am Ende der Klassendefinition mithilfe der
Funktion
property() so genannte Properties (Eigenschaften). Jede Property korrespondiert
def getWaehrung(self):
return self.__waehrung
def getEuro(self):
return self.__betrag * \
self.__wechselkurs[self.__waehrung]
def setBetrag(self, neuerBetrag):
self.__betrag = float (neuerBetrag)
def setWaehrung(self, neueWaehrung):
if neueWaehrung in self.__wechselkurs.keys():
alt = self.__wechselkurs[self.__waehrung]
neu = self.__wechselkurs[neueWaehrung]
self.__betrag = alt/neu * self.__betrag
self.__waehrung = neueWaehrung
def add (self, geld):
summe_in_Euro = self.getEuro() + geld.getEuro()
summe = Geld1(self.__waehrung,
summe_in_Euro/self.__wechselkurs[self.__waehrung])
return summe
>>> preis = Geld('USD', 1000)
>>> preis.setWaehrung('EUR')
>>> print(preis.getBetrag(), preis.getWaehrung())
849.98 EUR
Kapitel 10
Definition eigener Klassen
292
mit einem (privaten) Attribut, das nach außen sichtbar sein soll. Als Argumente werden die
Namen der Zugriffsmethoden übergeben, zuerst die Methode zum Abfragen und dann die
Methode zum Ändern. Die Namen dieser Methoden sind beliebig aber üblicherweise
beginnt – wie im obigen Beispiel – die Lesemethode mit
get und die Schreibmethode mit
set.
Im interaktiven Modus probieren wir die neue Klasse
Geld aus. Sie können beobachten,
dass man die Properties
waehrung und betrag wie Objektattribute anwendet, aber die Ände-
rungen der internen Attribute durch die Zugriffsmethoden kontrolliert werden.
Wenn beim Aufruf von property() das zweite Argument fehlt, wird keine keine Schreib-
methode spezifiziert. Dann gibt es beim Versuch eines schreibenden Zugriffs einen
Attri-
butError
, wie das folgende Beispiel zeigt. Objekte der Klasse Const sind konstante Objekte,
deren Zustand zwar abgefragt aber nicht geändert werden kann.
# geld2.py
class Geld(object):
...
betrag = property(getBetrag, setBetrag)
waehrung = property(getWaehrung, setWaehrung)
>>> preis = Geld('EUR', 1000)
>>> preis.waehrung = 'USD'
>>> print(preis.betrag, preis.waehrung)
1176.49827055 USD
# const.py
class Const(object):
def __init__(self, x):
self.__x = x
def getX (self):
return __x
x = property(getX)
>>> k = Const(100)
>>> print(k.x)
100
>>> k.x = 101
Traceback (most recent call last):
File "<pyshell#9>", line 1, in -toplevel-
k.x = 101
AttributeError: can't set attribute

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.