AMP Analytics -->

Teknoloji Rehberi

11 Mayıs 2025 Pazar

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.

Hiç yorum yok:

Yorum Gönder

Popular Posts