Python Polimorfizm

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ı

  1. Esneklik Sağlar: Kodun farklı türlerdeki nesnelerle çalışmasına olanak tanır.
  2. Kod Tekrarını Azaltır: Ortak davranışları genelleştirerek yeniden kullanılabilir hale getirir.
  3. Anlaşılır Kod: Nesneler arası ilişkiyi net bir şekilde ifade eder.

Polimorfizmin Temel Yapısı

Polimorfizm genellikle şu yollarla uygulanır:

  1. Metot Üzerinde Polimorfizm: Aynı metot adı, farklı sınıflarda farklı şekilde davranır.
  2. Sınıf Üzerinde Polimorfizm: Birden fazla sınıf aynı metodu farklı şekillerde uygular.
  3. 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.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir