1. Nesne Yönelimli Programlama (OOP) Nedir?

Nesne Yönelimli Programlama (OOP), programları sınıflar ve nesneler olarak organize etmenin bir yoludur. Python, OOP'yi destekleyen ve yaygın olarak kullanılan bir dildir. OOP'nin temel amacı, veriyi ve o veri üzerinde çalışacak olan işlemleri bir araya getirmek ve kodun yeniden kullanılabilirliğini sağlamaktır.

Neden OOP Kullanılır?
Yeniden Kullanılabilirlik: Sınıflar ve nesneler, belirli bir işlevi yerine getirmek için tekrar tekrar kullanılabilir.
Daha Temiz Kod: Karmaşık işlemleri, nesneler ve sınıflar halinde organize ederek daha temiz ve anlaşılır bir kod yapısı elde edersiniz.
Bakımı Kolay: Kodunuzu modüller halinde yazdığınızda, hataları tespit etmek ve düzeltmek daha kolay olur.

2. Python'da Sınıflar ve Nesneler

Sınıflar, nesnelerin bir şablonu veya mavi planıdır. Nesneler ise sınıflardan türetilmiş örneklerdir.

Sınıf Tanımlama: Python'da bir sınıf tanımlamak için class anahtar kelimesi kullanılır:

class Araba:
    marka = "Bilinmiyor"
    model = "Bilinmiyor"

araba1 = Araba()
print(araba1.marka)  # Çıktı: Bilinmiyor

Araba sınıfı, marka ve model özelliklerine sahip. araba1 adında bir nesne oluşturup, sınıfın varsayılan değerlerine erişiyoruz.

3. Yapıcı (Constructor) ve __init__ Metodu

__init__ metodu, bir nesne oluşturulurken otomatik olarak çağrılan özel bir metottur. Nesnelerin başlangıç değerlerini ayarlamak için kullanılır.

class Araba:
    def __init__(self, marka, model):
        self.marka = marka
        self.model = model

araba1 = Araba("Toyota", "Corolla")
print(araba1.marka)  # Çıktı: Toyota
print(araba1.model)  # Çıktı: Corolla

Yukarıdaki örnekte, Araba sınıfının __init__ metodu kullanılarak, nesneler oluşturulurken marka ve model bilgilerini belirleyebiliyoruz.

4. Sınıf ve Nesne Metodları

Sınıf metodları, sınıfın kendisine, nesne metodları ise belirli bir nesneye özel olarak çalışır.

class Araba:
    def __init__(self, marka, model):
        self.marka = marka
        self.model = model

    def tanim(self):
        return f"Bu araç {self.marka} markalı ve {self.model} modeldir."

araba1 = Araba("Ford", "Mustang")
print(araba1.tanim())  # Çıktı: Bu araç Ford markalı ve Mustang modeldir.

Araba sınıfının tanim adlı bir metodu var. Bu metod, marka ve model bilgilerini kullanarak bir açıklama döndürüyor.

5. Kapsülleme (Encapsulation)

Kapsülleme, bir sınıfın içindeki verilerin dışarıdan erişime kapatılması anlamına gelir. Python'da kapsülleme yapmak için özelliklerin başına "_" veya "__" eklenir.

class BankaHesabi:
    def __init__(self, bakiye):
        self.__bakiye = bakiye

    def bakiye_goster(self):
        return self.__bakiye

hesap = BankaHesabi(1000)
print(hesap.bakiye_goster())  # Çıktı: 1000

__bakiye değişkeni doğrudan erişime kapalıdır ve sadece bakiye_goster metodu üzerinden erişilebilir. Bu, verilerin gizliliğini sağlar.

6. Kalıtım (Inheritance)

Kalıtım, bir sınıfın başka bir sınıftan özellikleri ve metotları devralmasıdır. Bu, sınıflar arasında kodun yeniden kullanılabilirliğini artırır.

class Hayvan:
    def ses_cikar(self):
        return "Hayvan ses çıkarıyor."

class Kopek(Hayvan):
    def ses_cikar(self):
        return "Hav hav!"

kopek = Kopek()
print(kopek.ses_cikar())  # Çıktı: Hav hav!

Kopek sınıfı, Hayvan sınıfından kalıtım alıyor ve ses_cikar metodunu kendi ihtiyaçlarına göre yeniden tanımlıyor.

7. Çok Biçimlilik (Polymorphism)

Çok biçimlilik, farklı sınıfların aynı ada sahip metodlarının farklı davranışlar sergilemesini sağlar.

class Kedi:
    def ses_cikar(self):
        return "Miyav!"

class Kopek:
    def ses_cikar(self):
        return "Hav hav!"

hayvanlar = [Kedi(), Kopek()]

for hayvan in hayvanlar:
    print(hayvan.ses_cikar())
# Çıktı:
# Miyav!
# Hav hav!

Farklı sınıflardan nesneler aynı ses_cikar metodunu çağırır, ancak her biri kendine özgü ses çıkarır. Bu, çok biçimliliğin en iyi örneklerinden biridir.

8. Soyut Sınıflar ve Arayüzler

Soyut sınıflar, kendilerinden türetilen sınıflar için bir şablon sağlar. Python'da abc modülünü kullanarak soyut sınıflar oluşturabiliriz.

from abc import ABC, abstractmethod

class Sekil(ABC):
    @abstractmethod
    def alan(self):
        pass

class Kare(Sekil):
    def __init__(self, kenar):
        self.kenar = kenar

    def alan(self):
        return self.kenar * self.kenar

kare = Kare(5)
print(kare.alan())  # Çıktı: 25

Sekil soyut sınıfından türeyen Kare sınıfı, alan metodunu tanımlamak zorundadır. Soyut sınıflar, belirli bir yapıya sahip sınıflar oluşturmamıza olanak tanır.

9. Python'da OOP: Tüm Öğrendiklerimizi Bir Arada Kullanalım

Şimdiye kadar öğrendiğimiz tüm OOP kavramlarını içeren bir örnek yapalım.

class Hayvan:
    def __init__(self, isim, yas):
        self.isim = isim
        self.yas = yas

    def bilgi_ver(self):
        return f"{self.isim}, {self.yas} yaşında."

class Kedi(Hayvan):
    def ses_cikar(self):
        return "Miyav!"

class Kopek(Hayvan):
    def ses_cikar(self):
        return "Hav hav!"

class Ciftlik:
    def __init__(self):
        self.hayvanlar = []

    def hayvan_ekle(self, hayvan):
        self.hayvanlar.append(hayvan)

    def hayvan_sesleri(self):
        for hayvan in self.hayvanlar:
            print(f"{hayvan.bilgi_ver()} {hayvan.ses_cikar()}")

# Ciftlik ve hayvan nesnelerini oluşturma
ciftlik = Ciftlik()
kedi = Kedi("Tekir", 3)
kopek = Kopek("Karabaş", 5)

ciftlik.hayvan_ekle(kedi)
ciftlik.hayvan_ekle(kopek)

ciftlik.hayvan_sesleri()

Bu örnekte, Hayvan sınıfından türetilen Kedi ve Kopek sınıflarını kullandık. Ciftlik sınıfı ise bir çiftlikteki hayvanların seslerini organize ediyor. Tüm OOP kavramlarını bir arada kullanarak kompleks bir yapı oluşturduk.

Kapanış

Python'da Nesne Yönelimli Programlama (OOP), yazılım geliştirme süreçlerinde kodunuzu daha düzenli, modüler ve yeniden kullanılabilir hale getirmenin en etkili yollarından biridir. Sınıflar, nesneler, kalıtım, kapsülleme ve çok biçimlilik gibi temel kavramları kullanarak karmaşık problemleri daha basit ve anlaşılır yapılarla çözebilirsiniz. Bu rehberde OOP'nin tüm önemli noktalarını ve sıkça kullanılan yöntemlerini inceledik. OOP'yi iyi anlamak, Python'da ileri seviye projeler geliştirmenin anahtarıdır. Daha fazlasını öğrenmek için bol bol pratik yapmayı ve bu kavramları gerçek dünya projelerinde uygulamayı unutmayın!