Ga naar hoofdinhoud

Property vs. Getters en Setters in Python

In deze tutorial leer je wat het verschil is tussen Python Property en Getters & Setters.
· 6 min lezen

Verken met AI

Wat zijn getters en setters?

  • Getters: Dit zijn methoden in objectgeoriënteerd programmeren (OOP) die helpen om private attributen van een klasse te benaderen.
  • Setters: Dit zijn methoden in OOP die helpen om de waarde van private attributen in een klasse te zetten.

Privé-attribuut - Encapsulatie

Als je niet bekend bent met private attributen of private methoden in Python, lees dan dit DataCamp-artikel.

Laten we kijken hoe je een privé-attribuut in Python implementeert.

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 heeft drie methoden.

  • __init__:- Deze wordt gebruikt om de attributen of eigenschappen van een klasse te initialiseren.

    • __a:- Dit is een privé-attribuut.
  • get_a:- Wordt gebruikt om de waarden van het privé-attribuut a op te halen.
  • set_a:- Wordt gebruikt om de waarde van a te zetten met behulp van een object van een klasse.

Je kunt de private variabelen niet rechtstreeks benaderen in Python. Daarom heb je de getter-methode geïmplementeerd.

Laten we kijken hoe de klasse werkt.

## 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

Zo implementeer je private attributen, getters en setters in Python. In Java werd hetzelfde proces gevolgd. Laten we dezelfde implementatie nu op een Pythonice manier schrijven.

class PythonicWay:

    def __init__(self, a):
        self.a = a

Je hebt geen getters- of setters-methoden nodig om attributen te benaderen of te wijzigen. Je kunt ze direct benaderen via de namen van de attributen.

Laten we kijken.

## Creating an object for the 'PythonicWay' class
obj = PythonicWay(100)

print(obj.a)
100

Wat is het verschil tussen de bovenstaande twee klassen?

  • SampleClass verbergt de private attributen en methoden. Het implementeert de encapsulatie-eigenschap van OOP.
  • PythonicWay verbergt de data niet. Het implementeert geen enkele vorm van encapsulatie.

Wat kun je het beste gebruiken?

  • Dat hangt van je behoefte af. Als je private attributen en methoden wilt, kun je de klasse implementeren met setter- en getter-methoden; anders implementeer je het op de normale manier.

Property

Stel dat je voorwaarden wilt stellen aan het zetten van de waarde van een attribuut in de SampleClass.

Bijvoorbeeld: als de doorgegeven waarde even en positief is, zetten we die op het attribuut; anders zetten we de waarde op 2.

Laten we dit implementeren door de methode set_a() in de SampleClass aan te passen.

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

Laten we de klasse testen door een object aan te maken.

## creating an object for the class 'SampleClass1'
obj = SampleClass1(16)

print(obj.get_a())
16

Laten we bekijken hoe je bovenstaande klasse implementeert met de @property-decorator.

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 wordt gebruikt om de waarde van een privé-attribuut op te halen zonder een getter-methode te gebruiken. We moeten @property plaatsen boven de methode waarin we de private variabele retourneren.

Om de waarde van de private variabele te zetten, gebruiken we @method_name.setter boven de methode. We gebruiken die als setter.

Laten we de klasse Property testen om te zien of de decorators correct werken.

## creating an object for the class 'Property'
obj = Property(23)

print(obj.a)
2

@a.setter zet de waarde van a door de voorwaarden te controleren die we in de methode hebben vermeld. Een andere manier om property te gebruiken is...

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)

Geef alle getter- en setter-methoden door aan property en wijs die toe aan de variabele die je als klasse-attribuut wilt gebruiken.

## creating an object for the 'AnotherWay' class
obj = AnotherWay(28)

print(obj.a)
28

Maak de setter- en getter-methoden privé om ze te verbergen. Laten we dat doen.

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)

Laten we controleren of het correct werkt.

## creating an object for the 'AnotherWay' class
obj = FinalClass(12)

print(obj.a)
12

Conclusie

Je hebt nu gezien hoe je encapsulatie in Python kunt implementeren en wat het verschil is tussen setter, getter en property.

Als je nieuw bent met Python, raad ik je aan om DataCamp's gratis cursus Introduction to Python te volgen.

Heb je vragen over het artikel? Laat ze achter in de reacties. Happy coding!

Onderwerpen