Kurs
Was sind Getter und Setter?
- Getter: Methoden in der Objektorientierten Programmierung (OOP), mit denen du auf private Attribute einer Klasse zugreifen kannst.
- Setter: Methoden in OOP, mit denen du den Wert privater Attribute in einer Klasse setzt.
Private Attribute – Kapselung
Wenn dir private Attribute oder private Methoden in Python neu sind, lies diesen DataCamp Artikel.
Schauen wir uns an, wie du ein privates Attribut in Python umsetzt.
class SampleClass:
def __init__(self, a):
## private varibale or property in Python
self.__a = a
## getter method to get the properties using an object
def get_a(self):
return self.__a
## setter method to change the value 'a' using an object
def set_a(self, a):
self.__a = a
SampleClass hat drei Methoden.
-
__init__: Initialisiert die Attribute bzw. Eigenschaften einer Klasse.
- __a: Ein privates Attribut.
- get_a: Liest den Wert des privaten Attributs a aus.
- set_a: Setzt den Wert von a über ein Objekt der Klasse.
Auf private Variablen kannst du in Python nicht direkt zugreifen. Deshalb hast du die Getter-Methode implementiert.
So funktioniert die Klasse:
## creating an object
obj = SampleClass(10)
## getting the value of 'a' using get_a() method
print(obj.get_a())
## setting a new value to the 'a' using set_a() method
obj.set_a(45)
print(obj.get_a())
10
45
So implementierst du private Attribute, Getter und Setter in Python. Genauso wird es in Java gemacht. Schreiben wir das nun auf pythonice Art.
class PythonicWay:
def __init__(self, a):
self.a = a
Du brauchst keine Getter- oder Setter-Methoden, um auf Attribute zuzugreifen oder sie zu ändern. Du greifst direkt über den Namen des Attributs darauf zu.
Schauen wir mal:
## Creating an object for the 'PythonicWay' class
obj = PythonicWay(100)
print(obj.a)
100
Worin unterscheiden sich die beiden Klassen?
- SampleClass verbirgt private Attribute und Methoden. Sie setzt die Kapselung in OOP um.
- PythonicWay verbirgt die Daten nicht und verwendet keine Kapselung.
Was ist besser?
- Das hängt vom Anwendungsfall ab. Wenn du private Attribute und Methoden brauchst, implementierst du die Klasse mit Setter- und Getter-Methoden, sonst nimmst du den direkten, einfachen Ansatz.
Property
Was ist, wenn du beim Setzen eines Attributwerts in der SampleClass Bedingungen prüfen möchtest?
Angenommen, der übergebene Wert ist gerade und positiv: Dann setzen wir ihn. Andernfalls setzen wir den Wert auf 2.
Das implementieren wir, indem wir die Methode set_a() in der SampleClass anpassen.
class SampleClass1:
def __init__(self, a):
## calling the set_a() method to set the value 'a' by checking certain conditions
self.set_a(a)
## getter method to get the properties using an object
def get_a(self):
return self.__a
## setter method to change the value 'a' using an object
def set_a(self, a):
## condition to check whether 'a' is suitable or not
if a > 0 and a % 2 == 0:
self.__a = a
else:
self.__a = 2
Testen wir die Klasse, indem wir ein Objekt erzeugen.
## creating an object for the class 'SampleClass1'
obj = SampleClass1(16)
print(obj.get_a())
16
So setzt du dieselbe Klasse mit dem @property-Decorator um.
class Property:
def __init__(self, var):
## initializing the attribute
self.a = var
@property
def a(self):
return self.__a
## the attribute name and the method name must be same which is used to set the value for the attribute
@a.setter
def a(self, var):
if var > 0 and var % 2 == 0:
self.__a = var
else:
self.__a = 2
@property dient dazu, den Wert eines privaten Attributs ohne separate Getter-Methode auszulesen. Setze @property vor die Methode, die die private Variable zurückgibt.
Zum Setzen des privaten Attributs nutzt du @method_name.setter vor der entsprechenden Methode. Damit fungiert sie als Setter.
Testen wir die Klasse Property, um zu prüfen, ob die Decoratoren korrekt greifen.
## creating an object for the class 'Property'
obj = Property(23)
print(obj.a)
2
@a.setter setzt den Wert von a nach den in der Methode definierten Bedingungen. Eine weitere Möglichkeit, property zu verwenden, ist …
class AnotherWay:
def __init__(self, var):
## calling the set_a() method to set the value 'a' by checking certain conditions
self.set_a(var)
## getter method to get the properties using an object
def get_a(self):
return self.__a
## setter method to change the value 'a' using an object
def set_a
(self, var):
## condition to check whether var is suitable or not
if var > 0 and var % 2 == 0:
self.__a = var
else:
self.__a = 2
a = property(get_a, set_a)
Übergebe die Getter- und Setter-Methoden an property und weise das Ergebnis der Variablen zu, die du als Klassenattribut verwenden willst.
## creating an object for the 'AnotherWay' class
obj = AnotherWay(28)
print(obj.a)
28
Mache die Setter- und Getter-Methoden privat, um sie zu verbergen. So geht's:
class FinalClass:
def __init__(self, var):
## calling the set_a() method to set the value 'a' by checking certain conditions
self.__set_a(var)
## getter method to get the properties using an object
def __get_a(self):
return self.__a
## setter method to change the value 'a' using an object
def __set_a(self, var):
## condition to check whether var is suitable or not
if var > 0 and var % 2 == 0:
self.__a = var
else:
self.__a = 2
a = property(__get_a, __set_a)
Prüfen wir, ob alles wie erwartet funktioniert.
## creating an object for the 'AnotherWay' class
obj = FinalClass(12)
print(obj.a)
12
Fazit
Du hast gesehen, wie du Kapselung in Python umsetzt und worin sich Setter, Getter und property unterscheiden.
Wenn du neu bei Python bist, empfehle ich dir den kostenlosen DataCamp-Kurs Introduction to Python.
Wenn du Fragen zu diesem Artikel hast, schreib sie gerne in die Kommentare. Viel Spaß beim Coden!