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