Python OOP Detayları: Kapsülleme ve Çok Biçimlilik

Python OOP Detayları: Kapsülleme ve Çok Biçimlilik

OOP'nin temelini öğrendikten sonra, verilerimizi nasıl koruyacağımızı (Encapsulation) ve farklı nesnelerin aynı komuta nasıl farklı tepkiler vereceğini (Polymorphism) bilmek gerekir. Bu prensipler kodun güvenliğini ve esnekliğini sağlar.


1. Kapsülleme (Encapsulation)

Verilere dışarıdan doğrudan erişimi kısıtlamak ve veriyi bir koruma kalkanı içine almak demektir. Python'da bir değişkenin başına __ (iki alt çizgi) ekleyerek onu private (gizli) yapabilirsiniz.

Kapsülleme ve Gizli Değişken Örneği
class BankaHesabi:
    def __init__(self, bakiye):
        self.__bakiye = bakiye  # Private değişken (Dışarıdan erişilemez)

    def bakiye_goster(self):
        print(f"Mevcut Bakiye: {self.__bakiye} TL")

    def para_yatir(self, miktar):
        if miktar > 0:
            self.__bakiye += miktar

hesap = BankaHesabi(1000)
# print(hesap.__bakiye) # HATA VERİR! Doğrudan erişilemez.
hesap.bakiye_goster()    # Güvenli erişim

2. Çok Biçimlilik (Polymorphism)

Farklı nesnelerin, aynı isimdeki metoda kendilerine has bir şekilde yanıt vermesidir. Örneğin; "ses çıkar" komutu kedi için "miyav", köpek için "hav" sonucunu üretir.

Polymorphism Örneği
class Kus:
    def uc(self):
        print("Kuş uçuyor...")

class Penguen(Kus):
    def uc(self): # Aynı isimli metod ama farklı işlev
        print("Penguenler uçamaz, yüzerler!")

def ucur(hayvan):
    hayvan.uc()

serce = Kus()
pingu = Penguen()

ucur(serce) # Kuş uçuyor...
ucur(pingu) # Penguenler uçamaz, yüzerler!

Getter ve Setter Metodları

Gizli verilere güvenli bir şekilde erişmek ve bu verileri belirli kurallara göre değiştirmek için kullanılır.

Neden Kullanılır? Örneğin bir yaş değişkenini set ederken, eksi değer girilmesini engelleyen bir kontrolü Setter içine yazabilirsiniz.
class Personel:
    def __init__(self, maas):
        self.__maas = maas

    @property # Getter (Okuma)
    def maas(self):
        return self.__maas

    @maas.setter # Setter (Yazma)
    def maas(self, yeni_maas):
        if yeni_maas > 0:
            self.__maas = yeni_maas
        else:
            print("Geçersiz maaş girişi!")