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.
classSampleClass:def__init__(self, a):## private varibale or property in Python
self.__a = a
## getter method to get the properties using an objectdefget_a(self):return self.__a
## setter method to change the value 'a' using an objectdefset_a(self, a):
self.__a = a
Bereitgestellt von
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() methodprint(obj.get_a())## setting a new value to the 'a' using set_a() method
obj.set_a(45)print(obj.get_a())Bereitgestellt von
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)Bereitgestellt von
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.
classSampleClass1: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 objectdefget_a(self):return self.__a
## setter method to change the value 'a' using an objectdefset_a(self, a):## condition to check whether 'a' is suitable or notif a >0and a %2==0:
self.__a = a
else:
self.__a =2Bereitgestellt von
Testen wir die Klasse, indem wir ein Objekt erzeugen.
## creating an object for the class 'SampleClass1'
obj = SampleClass1(16)print(obj.get_a())Bereitgestellt von
So setzt du dieselbe Klasse mit dem @property-Decorator um.
classProperty:def__init__(self, var):## initializing the attribute
self.a = var
@propertydefa(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.setterdefa(self, var):if var >0and var %2==0:
self.__a = var
else:
self.__a =2Bereitgestellt von
@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)Bereitgestellt von
@a.setter setzt den Wert von a nach den in der Methode definierten Bedingungen. Eine weitere Möglichkeit, property zu verwenden, ist …
classAnotherWay: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 objectdefget_a(self):return self.__a
## setter method to change the value 'a' using an objectdefset_a(self, var):## condition to check whether var is suitable or notif var >0and var %2==0:
self.__a = var
else:
self.__a =2
a =property(get_a, set_a)Bereitgestellt von
Ü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)Bereitgestellt von
Mache die Setter- und Getter-Methoden privat, um sie zu verbergen. So geht's:
classFinalClass: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 objectdef__get_a(self):return self.__a
## setter method to change the value 'a' using an objectdef__set_a(self, var):## condition to check whether var is suitable or notif var >0and var %2==0:
self.__a = var
else:
self.__a =2
a =property(__get_a, __set_a)Bereitgestellt von
Prüfen wir, ob alles wie erwartet funktioniert.
## creating an object for the 'AnotherWay' class
obj = FinalClass(12)print(obj.a)Bereitgestellt von
Mach dich mit Python-Datenstrukturen vertraut: Lerne mehr über Datentypen und primitive sowie nicht-primitive Datenstrukturen wie Strings, Listen, Stapel usw.
Lerne die Funktionen und Methoden von Python-Listen kennen. Schau dir jetzt die Code-Beispiele für list() und andere Python-Funktionen und -Methoden an!
Was sind Getter und Setter?
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.
SampleClass hat drei Methoden.
__init__: Initialisiert die Attribute bzw. Eigenschaften einer Klasse.
Auf private Variablen kannst du in Python nicht direkt zugreifen. Deshalb hast du die Getter-Methode implementiert.
So funktioniert die Klasse:
So implementierst du private Attribute, Getter und Setter in Python. Genauso wird es in Java gemacht. Schreiben wir das nun auf pythonice Art.
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:
Worin unterscheiden sich die beiden Klassen?
Was ist besser?
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.
Testen wir die Klasse, indem wir ein Objekt erzeugen.
So setzt du dieselbe Klasse mit dem @property-Decorator um.
@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.
@a.setter setzt den Wert von a nach den in der Methode definierten Bedingungen. Eine weitere Möglichkeit, property zu verwenden, ist …
Übergebe die Getter- und Setter-Methoden an property und weise das Ergebnis der Variablen zu, die du als Klassenattribut verwenden willst.
Mache die Setter- und Getter-Methoden privat, um sie zu verbergen. So geht's:
Prüfen wir, ob alles wie erwartet funktioniert.
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!