- Katılım
- 7 Nis 2025
- Konular
- 367
- Mesajlar
- 780
- Çözümler
- 1
- Tepkime puanı
- 121
- Puan
- 93
- Konum
- İstanbul
- Web sitesi
- forumagel.com
Hazır Kod Bankası - Konu 12: Nesne Tabanlı Programlama (OOP) - İleri Kavramlar (Python ile)
Hazır Kod Bankası Serimizin On İkinci Konusu: OOP'de İleri Adımlar (Miras Alma ve Çok Biçimlilik)!
Merhaba arkadaşlar! Bir önceki konumuzda Nesne Tabanlı Programlamanın (OOP) temel yapı taşları olan Sınıf (Class), Nesne (Object), Özellik (Attribute) ve Metot (Method) kavramlarını Python ile öğrenmiştik. OOP'yi sadece bir kod organizasyon tekniği olmaktan çıkarıp güçlü bir tasarım yaklaşımı haline getiren diğer önemli prensipler ise Miras Alma (Inheritance) ve Çok Biçimlilik (Polymorphism)'dir.
Bu prensipler sayesinde kod tekrarını azaltabilir, daha esnek yapılar kurabilir ve farklı türdeki nesnelerle standart bir arayüz üzerinden etkileşime girebiliriz. Bu konuda bu iki temel OOP prensibini Python üzerinden basit ve anlaşılır örneklerle inceleyeceğiz.
(Not: OOP'nin diğer önemli prensipleri olan Kapsülleme (Encapsulation) ve Soyutlama (Abstraction) da bulunmaktadır. Bu konuda Miras Alma ve Çok Biçimlilik'e odaklanacağız, diğer kavramlar için serinin devamında ayrı konular açılabilir.)
1. Miras Alma (Inheritance)
Miras alma, bir sınıfın (alt sınıf veya türetilmiş sınıf), başka bir sınıftan (ana sınıf veya temel sınıf) özelliklerini ve metotlarını devralmasıdır. Bu, "bir ... türüdür" ("Is-a") ilişkisini ifade eder. Örneğin, Köpek bir Hayvan türüdür, Kedi bir Hayvan türüdür.
Miras alma sayesinde ortak özellik ve davranışları temel sınıfta tanımlayıp, bu sınıftan miras alan alt sınıfların sadece kendilerine özgü farklılıkları tanımlamasını sağlayarak kod tekrarını önler ve kodun daha düzenli olmasını sağlarız.
Python'da Miras Alma Sözdizimi:
Python:
# Ana Sınıf (Base Class / Parent Class)
class Hayvan:
def __init__(self, isim):
self.isim = isim
def ses_cikar(self):
print("Bir hayvan sesi")
def yemek_ye(self):
print(f"{self.isim} yemek yiyor.")
# Alt Sınıf (Derived Class / Child Class) - Hayvan sınıfından miras alıyor
class Kopek(Hayvan):
# __init__ metodunu ezebiliriz (override) veya miras alabiliriz.
# Miras alınan __init__'i çağırmak için super().__init__() kullanılır.
def __init__(self, isim, irk):
super().__init__(isim) # Ana sınıfın __init__ metodunu çağır
self.irk = irk # Köpeğe özgü yeni özellik
# ses_cikar metodunu eziyoruz (override)
def ses_cikar(self):
print("Hav hav!")
# Köpeğe özgü yeni metot
def getir(self):
print(f"{self.isim} bir şey getiriyor.")
# Başka bir Alt Sınıf - Hayvan sınıfından miras alıyor
class Kedi(Hayvan):
# ses_cikar metodunu eziyoruz (override)
def ses_cikar(self):
print("Miyav!")
# Kediye özgü yeni metot
def tirman(self):
print(f"{self.isim} tırmanıyor.")
# Nesneleri oluşturma
hayvan1 = Hayvan("Genel Hayvan")
kopek1 = Kopek("Kont", "Golden Retriever")
kedi1 = Kedi("Tekir") # Kedi sınıfının kendi __init__ metodunu yazmadık, Hayvan'dan miras aldı
# Metotları çağırma
hayvan1.yemek_ye() # Çıktı: Genel Hayvan yemek yiyor.
kopek1.yemek_ye() # Miras aldığı metot -> Çıktı: Kont yemek yiyor.
kedi1.yemek_ye() # Miras aldığı metot -> Çıktı: Tekir yemek yiyor.
hayvan1.ses_cikar() # Çıktı: Bir hayvan sesi
kopek1.ses_cikar() # Ezdiği metot -> Çıktı: Hav hav!
kedi1.ses_cikar() # Ezdiği metot -> Çıktı: Miyav!
kopek1.getir() # Köpeğe özgü metot -> Çıktı: Kont bir şey getiriyor.
# kedi1.getir() # Hata verir, Kedi sınıfında 'getir' metodu yok
# Nesnelerin özelliklerine erişme
print(f"Köpeğin Irkı: {kopek1.irk}") # Köpeğe özgü özellik
print(f"Kedinin Adı: {kedi1.isim}") # Miras aldığı özellik
2. Çok Biçimlilik (Polymorphism)
Çok biçimlilik, farklı nesnelerin aynı metoda çağrıldığında kendi tiplerine özgü farklı davranışlar sergilemesidir. OOP bağlamında en yaygın hali, Miras Alma ile birlikte görülür. Farklı alt sınıflardan türetilmiş nesneleri, sanki hepsi ana sınıfın birer örneğiymiş gibi işleyebiliriz, ancak metot çağrıldığında Python nesnenin gerçek tipini anlayıp o tipe ait ezilmiş (override edilmiş) metodu çalıştırır.
Python'da Çok Biçimlilik Örneği:
Python:
# Önceki örnekteki Hayvan, Kopek, Kedi sınıflarının tanımlı olduğunu varsayalım
# Farklı hayvan nesnelerinin bir listesini oluşturma
hayvan_listesi = [Hayvan("Genel"), Kopek("Lessi", "Collie"), Kedi("Boncuk")]
print("Hayvanlar ses çıkarıyor:")
# Listedeki her nesneyi döngü ile gez
for hayvan in hayvan_listesi:
# Her nesne için 'ses_cikar' metodunu çağır
# Python nesnenin gerçek tipini (Hayvan, Kopek veya Kedi) anlar
# ve o tipe ait olan ses_cikar metodunu çalıştırır.
hayvan.ses_cikar()
# Çıktı:
# Bir hayvan sesi
# Hav hav!
# Miyav!
Python gibi dillerde çok biçimlilik sadece miras almaya bağlı değildir, "Duck Typing" denilen bir kavramla da ilişkilidir: "Eğer bir şeye benziyor, bir şey gibi yüzüyor ve bir ördek gibi vakvaklıyorsa, o şey büyük ihtimalle bir ördektir." Yani, Python'da farklı sınıflardan olsalar bile, eğer nesnelerin aynı isimde metotları varsa, o metotları çok biçimli bir şekilde çağırabilirsiniz. Ancak başlangıç için miras alma üzerinden çok biçimliliği anlamak önemlidir.
Sıra Sizde!
Miras alma ve çok biçimlilik OOP'nin güçlü yönlerindendir. Bu kavramları pekiştirmek için:
- Kendi temel sınıfınızı (`Sekil`, `Calisan` gibi) ve ondan miras alan alt sınıflarınızı (`Kare`, `Daire`; `Yazilimci`, `Mudur` gibi) tanımlayın.
- Ortak metotları ana sınıfta tanımlayıp, alt sınıflarda bu metotları kendi ihtiyaçlarınıza göre ezin (override edin).
- Farklı alt sınıflardan nesneler içeren bir liste oluşturun ve bir döngü içinde bu nesnelerin ortak metotlarını çağırarak çok biçimliliği gözlemleyin.
- `super()` fonksiyonunu kullanarak ana sınıfın metotlarına alt sınıflardan erişmeyi deneyin.
Serinin Geleceği?[/B]
OOP'nin temel ve ileri kavramlarına (Sınıf, Nesne, Özellik, Metot, Miras Alma, Çok Biçimlilik) Python üzerinden giriş yaptık.
Seriyi buradan sonra nasıl devam ettirelim?
- OOP'de kalan kavramlar (Kapsülleme, Soyutlama) veya Tasarım Kalıpları (Design Patterns) gibi konulara giriş?
- Farklı dillerde OOP uygulama (PHP OOP, JavaScript OOP, C# OOP temelleri)?
- Başka bir programlama dili (Java, C++, C# temelleri)?
- Popüler bir kütüphane veya framework'e giriş (Python web frameworkleri Flask/Django, Veri Analizi Pandas, JS frameworkleri React/Vue)?
- Yazılım geliştirmede önemli genel kavramlar (Versiyon Kontrol - Git, Temel Veri Yapıları ve Algoritmalar)?
- Veya başka önerileriniz mi var?
Umarım bu konu OOP bilginizi bir adım öteye taşımıştır. Görüşmek üzere!
Bu konu, "Hazır Kod Bankası" serisinin on ikinci parçasıdır ve "Yazılım Bilgi ve Yeni Başlayanlar İçin" kategorisi altında paylaşılmıştır.