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!