Ana içeriğe geç

Python'da Property ile Getter ve Setter'lar

Bu eğitimde, Python Property ile Getter & Setter’lar arasındaki farkı öğreneceksiniz.
· 6 dk. oku

Yapay Zeka ile Keşfedin

Getter ve Setter nedir?

  • Getter: Nesne Yönelimli Programlama (OOP) içinde bir sınıfın özel (private) niteliklerine erişmek için kullanılan yöntemlerdir.
  • Setter: OOP özelliğinde, bir sınıftaki özel niteliklere değer atamak için kullanılan yöntemlerdir.

Özel Nitelik - Kapsülleme

Python'da özel niteliklere veya özel yöntemlere aşina değilseniz, bu DataCamp makalesini okuyun.

Python içinde özel bir niteliği nasıl uygulayabileceğinize bakalım.

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'ın üç yöntemi bulunur.

  • __init__:- Bir sınıfın niteliklerini veya özelliklerini başlatmak için kullanılır.

    • __a:- Bu özel bir niteliktir.
  • get_a:- Özel nitelik a'nın değerini almak için kullanılır.
  • set_a:- Bir sınıfın nesnesini kullanarak a'nın değerini atamak için kullanılır.

Python içinde özel değişkenlere doğrudan erişemezsiniz. Bu nedenle bir getter yöntemi uygularsınız.

Sınıfın nasıl çalıştığına bakalım.

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

Bu şekilde Python'da özel nitelikleri, getter ve setterları uygularsınız. Aynı süreç Java'da da izlenirdi. Şimdi aynı uygulamayı daha Pythonic bir şekilde yazalım.

class PythonicWay:

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

Niteliklere erişmek veya onları değiştirmek için getter, setter yöntemlerine ihtiyacınız yoktur. Niteliklerin adıyla doğrudan erişebilirsiniz.

Görelim.

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

print(obj.a)
100

Yukarıdaki iki sınıf arasındaki fark nedir?

  • SampleClass özel nitelikleri ve yöntemleri gizler. OOP'un kapsülleme özelliğini uygular.
  • PythonicWay veriyi gizlemez. Herhangi bir kapsülleme özelliği uygulamaz.

Hangisini kullanmak daha iyidir?

  • İhtiyacımıza bağlıdır. Özel niteliklere ve yöntemlere ihtiyacınız varsa, setter ve getter yöntemlerini kullanarak bir sınıf uygulayabilirsiniz; aksi halde normal yolu kullanırsınız.

Property

Şimdi, SampleClass içinde bir niteliğin değerini atamak için bazı koşullar koymak istediğinizde ne olur?

Diyelim ki, verdiğimiz değer çift ve pozitifse niteliğe atayalım; aksi halde değeri 2 yapalım.

Bunu, SampleClass içindeki set_a() yöntemini değiştirerek uygulayalım.

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

Bir nesne oluşturarak sınıfı kontrol edelim.

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

print(obj.get_a())
16

Yukarıdaki sınıfı @property dekoratörünü kullanarak nasıl uygulayacağımıza bakalım.

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, herhangi bir getter yöntemi kullanmadan özel bir niteliğin değerini almak için kullanılır. Özel değişkeni döndürdüğümüz yöntemin başına @property satırını koymamız gerekir.

Özel değişkenin değerini atamak için, yöntem adının önünde @method_name.setter kullanırız. Bunu bir setter olarak kullanmalıyız.

Property sınıfının dekoratörlerin düzgün çalışıp çalışmadığını test edelim.

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

print(obj.a)
2

@a.setter, yöntemde belirttiğimiz koşulları kontrol ederek a'nın değerini atar. property'i kullanmanın bir başka yolu da...

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)

Tüm getter ve setter yöntemlerini property'ye aktarın ve bir sınıf niteliği olarak kullanacağınız değişkene atayın.

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

print(obj.a)
28

setter ve getter yöntemlerini gizlemek için özel yapın. Hadi yapalım.

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)

Düzgün çalışıp çalışmadığını kontrol edelim.

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

print(obj.a)
12

Sonuç

Artık Python'da kapsüllemeyi nasıl uygulayabileceğinizi ve setter, getter ile property arasındaki farkı gördünüz.

Python'a yeniyseniz, DataCamp'in ücretsiz Introduction to Python kursunu almanızı öneririm.

Makaleyle ilgili sorularınız varsa lütfen yorum kısmında belirtin. Mutlu Kodlamalar!

Konular

İlgili