Python'da Nesne Yönelimli Programlama (OOP) Kavramları

 

Python'da Nesne Yönelimli Programlama (OOP) Kavramları

Python'da Nesne Yönelimli Programlama (Object-Oriented Programming - OOP), kodunuzu daha modüler, yeniden kullanılabilir ve organize hale getirmenizi sağlayan güçlü bir paradigmadır. Python'da OOP'nin dört temel kavramı vardır:

1. Sınıflar (Classes) ve Nesneler (Objects)

Sınıf, bir nesnenin şablonu veya planıdır. Nesne ise bir sınıfın örneğidir.

python
Copy
Download
class Araba:
    # Sınıf niteliği (class attribute)
    tekerlek_sayisi = 4
    
    # __init__ metodu (constructor)
    def __init__(self, marka, model, yil):
        # Örnek nitelikleri (instance attributes)
        self.marka = marka
        self.model = model
        self.yil = yil
        self.benzin_seviyesi = 0
    
    # Örnek metodu (instance method)
    def benzin_ekle(self, litre):
        self.benzin_seviyesi += litre
        return f"{litre} litre benzin eklendi. Yeni seviye: {self.benzin_seviyesi}"
    
    # Sınıf metodu (class method)
    @classmethod
    def araba_tanimi(cls):
        return f"Arabaların genellikle {cls.tekerlek_sayisi} tekerleği vardır."
    
    # Statik metot (static method)
    @staticmethod
    def motor_tipi(motor):
        return f"Motor tipi: {motor}"

# Nesne oluşturma
araba1 = Araba("Toyota", "Corolla", 2020)
print(araba1.marka)  # Toyota
print(araba1.benzin_ekle(20))  # 20 litre benzin eklendi. Yeni seviye: 20

2. Kapsülleme (Encapsulation)

Kapsülleme, bir nesnenin iç detaylarını dışarıdan gizleyerek sadece belirli metodlar aracılığıyla erişime izin verme prensibidir.

python
Copy
Download
class BankaHesabi:
    def __init__(self, hesap_sahibi, bakiye=0):
        self.hesap_sahibi = hesap_sahibi
        self.__bakiye = bakiye  # Private attribute
    
    def bakiye_goster(self):
        return f"Bakiyeniz: {self.__bakiye}"
    
    def para_yatir(self, miktar):
        if miktar > 0:
            self.__bakiye += miktar
            return f"{miktar} TL yatırıldı. Yeni bakiye: {self.__bakiye}"
        return "Geçersiz miktar"
    
    def para_cek(self, miktar):
        if 0 < miktar <= self.__bakiye:
            self.__bakiye -= miktar
            return f"{miktar} TL çekildi. Yeni bakiye: {self.__bakiye}"
        return "Yetersiz bakiye veya geçersiz miktar"

hesap = BankaHesabi("Ahmet", 1000)
print(hesap.bakiye_goster())  # Bakiyeniz: 1000
print(hesap.para_yatir(500))  # 500 TL yatırıldı. Yeni bakiye: 1500
# print(hesap.__bakiye)  # Hata verir (AttributeError)

3. Miras Alma (Inheritance)

Miras alma, bir sınıfın başka bir sınıfın özelliklerini ve metodlarını almasıdır.

python
Copy
Download
class Calisan:
    def __init__(self, ad, soyad, maas):
        self.ad = ad
        self.soyad = soyad
        self.maas = maas
    
    def tam_ad(self):
        return f"{self.ad} {self.soyad}"
    
    def maas_arttir(self, oran):
        self.maas += self.maas * oran / 100

# Calisan sınıfından miras alan Yonetici sınıfı
class Yonetici(Calisan):
    def __init__(self, ad, soyad, maas, departman):
        super().__init__(ad, soyad, maas)  # Üst sınıfın __init__ metodunu çağırır
        self.departman = departman
    
    def maas_arttir(self, oran, bonus=0):
        super().maas_arttir(oran)  # Üst sınıfın metodunu çağırır
        self.maas += bonus

yonetici = Yonetici("Ayşe", "Yılmaz", 10000, "IT")
print(yonetici.tam_ad())  # Ayşe Yılmaz
yonetici.maas_arttir(10, 500)
print(yonetici.maas)  # 11500 (10000 + %10 = 11000 + 500 bonus = 11500)

4. Çok Biçimlilik (Polymorphism)

Çok biçimlilik, farklı sınıfların aynı metod ismini farklı şekillerde uygulayabilmesidir.

python
Copy
Download
class Hayvan:
    def ses_cikar(self):
        pass

class Kedi(Hayvan):
    def ses_cikar(self):
        return "Miyav!"

class Kopek(Hayvan):
    def ses_cikar(self):
        return "Hav hav!"

class Kus(Hayvan):
    def ses_cikar(self):
        return "Cik cik!"

# Polymorphism örneği
def hayvan_sesi(hayvan):
    print(hayvan.ses_cikar())

hayvanlar = [Kedi(), Kopek(), Kus()]
for hayvan in hayvanlar:
    hayvan_sesi(hayvan)
# Çıktı:
# Miyav!
# Hav hav!
# Cik cik!

Ek OOP Kavramları

1. Soyut Sınıflar (Abstract Classes)

python
Copy
Download
from abc import ABC, abstractmethod

class Sekil(ABC):
    @abstractmethod
    def alan(self):
        pass
    
    @abstractmethod
    def cevre(self):
        pass

class Dikdortgen(Sekil):
    def __init__(self, uzunluk, genislik):
        self.uzunluk = uzunluk
        self.genislik = genislik
    
    def alan(self):
        return self.uzunluk * self.genislik
    
    def cevre(self):
        return 2 * (self.uzunluk + self.genislik)

# sekil = Sekil()  # Hata verir, çünkü soyut sınıf
dikdortgen = Dikdortgen(5, 3)
print(dikdortgen.alan())  # 15

2. Magic (Dunder) Methods

python
Copy
Download
class Kitap:
    def __init__(self, baslik, yazar, sayfa):
        self.baslik = baslik
        self.yazar = yazar
        self.sayfa = sayfa
    
    def __str__(self):
        return f"{self.baslik} - {self.yazar}"
    
    def __len__(self):
        return self.sayfa
    
    def __eq__(self, other):
        return self.baslik == other.baslik and self.yazar == other.yazar

kitap1 = Kitap("Python 101", "Ahmet Yılmaz", 250)
kitap2 = Kitap("Python 101", "Ahmet Yılmaz", 300)

print(kitap1)  # Python 101 - Ahmet Yılmaz
print(len(kitap1))  # 250
print(kitap1 == kitap2)  # True (başlık ve yazar aynı)

3. Composition vs Inheritance

python
Copy
Download
# Composition örneği
class Motor:
    def __init__(self, guc):
        self.guc = guc
    
    def calistir(self):
        return "Motor çalışıyor"

class Araba:
    def __init__(self, marka, motor_gucu):
        self.marka = marka
        self.motor = Motor(motor_gucu)  # Composition
    
    def calistir(self):
        return f"{self.marka} araba: {self.motor.calistir()}"

araba = Araba("BMW", 2000)
print(araba.calistir())  # BMW araba: Motor çalışıyor

4. Property Decorator

python
Copy
Download
class Daire:
    def __init__(self, yaricap):
        self._yaricap = yaricap  # Protected attribute
    
    @property
    def yaricap(self):
        return self._yaricap
    
    @yaricap.setter
    def yaricap(self, value):
        if value < 0:
            raise ValueError("Yarıçap negatif olamaz")
        self._yaricap = value
    
    @property
    def alan(self):
        return 3.14 * self._yaricap ** 2

daire = Daire(5)
print(daire.yaricap)  # 5
print(daire.alan)  # 78.5
daire.yaricap = 10
print(daire.alan)  # 314.0
# daire.yaricap = -5  # ValueError: Yarıçap negatif olamaz

Bu kavramlar, Python'da nesne yönelimli programlamanın temel taşlarıdır. Doğru şekilde uygulandığında, daha temiz, daha modüler ve daha sürdürülebilir kod yazmanızı sağlarlar.

Yorumlar

Bu blogdaki popüler yayınlar

YouTube ile Web Sitesi SEO'su: Kapsamlı Strateji Rehberi

Uygulama Reklam Butonu