Zum Hauptinhalt springen

Property vs. Getter und Setter in Python

In diesem Tutorial lernst du den Unterschied zwischen Python Property und Getter & Setter kennen.
· 6 Min. lesen

Entdecke KI

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!

Themen

Ähnlich

Tutorial

Python Datenstrukturen Tutorial