Polimorfizm (Çok Biçimlilik), nesne tabanlı programlamanın temel özelliklerinden biridir. Polimorfizm, farklı sınıfların aynı isimde metotlara sahip olup, bu metotların her sınıfta farklı şekilde çalışmasını sağlar. Bu, kodun daha esnek, yeniden kullanılabilir ve genişletilebilir olmasını sağlar.
Polimorfizmin Faydaları
- Esneklik Sağlar: Kodun farklı türlerdeki nesnelerle çalışmasına olanak tanır.
- Kod Tekrarını Azaltır: Ortak davranışları genelleştirerek yeniden kullanılabilir hale getirir.
- Anlaşılır Kod: Nesneler arası ilişkiyi net bir şekilde ifade eder.
Polimorfizmin Temel Yapısı
Polimorfizm genellikle şu yollarla uygulanır:
- Metot Üzerinde Polimorfizm: Aynı metot adı, farklı sınıflarda farklı şekilde davranır.
- Sınıf Üzerinde Polimorfizm: Birden fazla sınıf aynı metodu farklı şekillerde uygular.
- Yerleşik Polimorfizm: Python’un yerleşik operatörlerinin veya işlevlerinin farklı veri türleriyle farklı davranması.
1. Metot Üzerinde Polimorfizm
Örnek 1: Temel Polimorfizm
class Kuş:
def ses_ver(self):
return "Çeşitli kuş sesleri"
class Serçe(Kuş):
def ses_ver(self):
return "Cik cik"
class Karga(Kuş):
def ses_ver(self):
return "Gak gak"
def sesleri_yazdır(kuş):
print(kuş.ses_ver())
serçe = Serçe()
karga = Karga()
sesleri_yazdır(serçe) # Çıktı: Cik cik
sesleri_yazdır(karga) # Çıktı: Gak gak
Bu örnekte, ses_ver
metodu hem Serçe
hem de Karga
sınıflarında farklı şekilde uygulanmıştır.
2. Sınıf Üzerinde Polimorfizm
Farklı sınıflarda aynı metodu kullanarak nesnelerle aynı işlemi gerçekleştirebilirsiniz.
Örnek: Şekiller
class Kare:
def __init__(self, kenar):
self.kenar = kenar
def alan(self):
return self.kenar ** 2
class Dikdörtgen:
def __init__(self, uzunluk, genişlik):
self.uzunluk = uzunluk
self.genislik = genişlik
def alan(self):
return self.uzunluk * self.genislik
def alan_hesapla(şekil):
print(f"Alan: {şekil.alan()}")
kare = Kare(4)
dikdörtgen = Dikdörtgen(5, 3)
alan_hesapla(kare) # Çıktı: Alan: 16
alan_hesapla(dikdörtgen) # Çıktı: Alan: 15
3. Yerleşik Polimorfizm
Python’un yerleşik operatör ve işlevleri farklı veri türleriyle farklı şekilde çalışabilir.
Örnek 1: +
Operatörü
# Sayılar için toplama
print(5 + 10) # Çıktı: 15
# Stringler için birleştirme
print("Merhaba" + " Dünya") # Çıktı: Merhaba Dünya
Örnek 2: len()
Fonksiyonu
print(len([1, 2, 3])) # Çıktı: 3 (Liste uzunluğu)
print(len("Python")) # Çıktı: 6 (String uzunluğu)
print(len({"a": 1, "b": 2})) # Çıktı: 2 (Sözlük uzunluğu)
4. Polimorfizm ve Kalıtım
Polimorfizm genellikle kalıtımla birlikte kullanılır. Alt sınıflar, üst sınıftan devralınan metotları kendi ihtiyaçlarına göre yeniden tanımlar.
Örnek: Taşıtlar
class Taşıt:
def hareket(self):
return "Taşıt hareket ediyor."
class Araba(Taşıt):
def hareket(self):
return "Araba ilerliyor."
class Bisiklet(Taşıt):
def hareket(self):
return "Bisiklet pedal çeviriyor."
taşıtlar = [Araba(), Bisiklet(), Taşıt()]
for taşıt in taşıtlar:
print(taşıt.hareket())
Çıktı:
Araba ilerliyor.
Bisiklet pedal çeviriyor.
Taşıt hareket ediyor.
Polimorfizmin Kullanım Alanları
- Farklı veri türleriyle çalışmak: Örneğin, dosya okuma/yazma işlemlerinde hem JSON hem de CSV formatlarını desteklemek.
- Oyun geliştirme: Karakterlerin farklı davranışlarını temsil etmek.
- Arayüz tasarımı: Birden fazla sınıfta aynı metot adlarını farklı şekilde uygulamak.
Pratik Uygulama
Örnek: Hayvanat Bahçesi
class Hayvan:
def konuş(self):
raise NotImplementedError("Bu metod alt sınıfta tanımlanmalıdır.")
class Aslan(Hayvan):
def konuş(self):
return "Roar!"
class Kuş(Hayvan):
def konuş(self):
return "Cik cik!"
def hayvan_konuş(hayvan):
print(hayvan.konuş())
aslan = Aslan()
kuş = Kuş()
hayvan_konuş(aslan) # Çıktı: Roar!
hayvan_konuş(kuş) # Çıktı: Cik cik!
Soru ve Çözüm
Soru:
Bir Çalışan
sınıfı ve ondan türeyen Yönetici
ve Mühendis
sınıfları oluşturun. Her sınıfın bir bilgi_ver
metodu olsun ve her sınıf bu metodu farklı şekilde uygulasın.
Çözüm:
class Çalışan:
def bilgi_ver(self):
raise NotImplementedError("Bu metod alt sınıfta tanımlanmalıdır.")
class Yönetici(Çalışan):
def bilgi_ver(self):
return "Yönetici bilgisi: Toplantı düzenler."
class Mühendis(Çalışan):
def bilgi_ver(self):
return "Mühendis bilgisi: Proje tasarlar."
çalışanlar = [Yönetici(), Mühendis()]
for çalışan in çalışanlar:
print(çalışan.bilgi_ver())
Çıktı:
Yönetici bilgisi: Toplantı düzenler.
Mühendis bilgisi: Proje tasarlar.
Sonuç
Polimorfizm, nesne tabanlı programlamada kodunuzu esnek, yeniden kullanılabilir ve genişletilebilir hale getirir. Kalıtım ve polimorfizm birlikte kullanıldığında, yazılım geliştirme sürecini daha etkili ve düzenli hale getirir. Python’un esnek yapısı sayesinde polimorfizmi kolayca uygulayabilir ve kodlarınızı optimize edebilirsiniz.