Neler yeni

Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

  • Merhaba Değerli Ziyaretçimiz, ForumaGel ailesi seni bekliyor! 🌟 Aramıza katılarak güçlü ve samimi topluluğumuzun bir parçası olabilirsin. Burada her üye değerli, her katkı kıymetli. Şimdi üye ol, bizimle birlikte gelişmenin ve keyifli sohbetlerin tadını çıkar! Sevgi ve Saygılarla, ForumaGel Yönetimi ❤️
Yan Yana Banner
Yan Yana Banner
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
Açıklama: `class Kopek(Hayvan):` ve `class Kedi(Hayvan):` sözdizimi miras almayı belirtir. `Kopek` ve `Kedi` sınıfları `Hayvan` sınıfının `yemek_ye()` gibi metotlarını otomatik olarak miras alır. `ses_cikar()` metotlarını kendi içlerinde tekrar tanımlayarak (override ederek), miras aldıkları varsayılan davranışı değiştirmiş olurlar. `super().__init__(isim)` kodu, `Kopek` sınıfının kendi `__init__` metodunun içinde ana sınıfın `__init__` metodunu çağırmasını sağlar, böylece `isim` özelliğini `Hayvan` sınıfının ele almasına izin veririz.

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!
Açıklama: `hayvan_listesi` içinde farklı tiplerden (Hayvan, Kopek, Kedi) nesneler olmasına rağmen, döngü içinde hepsine aynı `hayvan.ses_cikar()` komutunu veriyoruz. Çok biçimlilik sayesinde, Python her nesnenin kendi tipine ait `ses_cikar` metodunu bulup çalıştırıyor. Bu, farklı nesne türlerini standart bir arayüz üzerinden işlemek gerektiğinde (örneğin farklı şekilleri ekrana çizen bir programda, her şeklin kendi 'ciz()' metodunu çağırmak gibi) kodun daha esnek ve yönetilebilir olmasını sağlar.

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.
Miras alma, ezme (overriding), `super()`, çok biçimlilik kavramları hakkında aklınıza takılan soruları bu konu altında sorabilirsiniz.

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?
Geri bildirimleriniz ve önerileriniz serinin geleceğini şekillendirecektir.

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.
 

Şu an konuyu görüntüleyenler

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz

Zevkini yansıtan rengi seç

Geniş / Dar görünüm

Temanızı geniş yada dar olarak kullanmak için kullanabileceğiniz bir yapıyı kontrolünü sağlayabilirsiniz.

Izgara görünümlü forum listesi

Forum listesindeki düzeni ızgara yada sıradan listeleme tarzındaki yapının kontrolünü sağlayabilirsiniz.

Resimli ızgara modu

Izgara forum listesinde resimleri açıp/kapatabileceğiniz yapının kontrolünü sağlayabilirsiniz.

Kenar çubuğunu kapat

Kenar çubuğunu kapatarak forumdaki kalabalık görünümde kurtulabilirsiniz.

Sabit kenar çubuğu

Kenar çubuğunu sabitleyerek daha kullanışlı ve erişiminizi kolaylaştırabilirsiniz.

Köşe kıvrımlarını kapat

Blokların köşelerinde bulunan kıvrımları kapatıp/açarak zevkinize göre kullanabilirsiniz.

Geri