Nesne Yönelimli Programlama (OOP)
Sınıflar:
Nesne yönelimli programlama, nesnelerin ve sınıfların üzerine kuruludur. Sınıflar, nesneleri oluşturmak için kullanılan yapılar olup, nesnelerin özelliklerini (attribute) ve davranışlarını (method) tanımlarlar.
Not:
Fonksiyonları tanımlamak için def
anahtar sözcüğünü kullanırken, sınıfları tanımlamak için class
anahtar sözcüğünü kullanırız. class
ifadesinin ardından gelen isim, o sınıfın adını temsil eder.
Fonksiyonların aksine, bir sınıf tanımlandıktan sonra, sınıftan bir örnek (instance) oluşturulmadığı sürece, o sınıfın hiçbir işlevi çalıştırılmaz.
class ÇalışanSınıfı():
pass # Boş bir sınıf tanımladık.
class Ogrenci:
isim = "Mehmet"
soyisim = "Yıldırım"
yas = 12
not_ort = 90
print(Ogrenci.isim) # Sınıf niteliğine erişim.
Mehmet
Ogrenci.yas = 25
print(Ogrenci.yas) # Sınıf niteliğine değer atayarak değiştirdik.
25
ogrenci1 = Ogrenci() # Sınıftan bir örnek oluşturduk (instantiation).
Not:
ogrenci1
örneği, Ogrenci
sınıfından türetilmiştir. Bu işleme teknik dilde ‘örnekleme’ veya ‘örneklendirme’ (instantiation) adı verilir.
print(ogrenci1.isim) # Sınıf örneğinin niteliğine erişim.
'Mehmet'
ogrenci2 = Ogrenci()
ogrenci2.isim = "Ali"
print(ogrenci2.isim) # Sınıf örneğinin niteliğini değiştirdik.
'Ali'
print(ogrenci2.not_ort) # Sınıf örneğinin başka bir niteliğine erişim.
90
class Ogrenci:
def __init__(self, isim, soyisim, yas, not_ort): # Sınıfın yapıcı (initializer) metodu.
self.nesne_ismi = isim
self.nesne_soyismi = soyisim
self.nesnenin_yasi = yas
self.nesnenin_not_ort = not_ort
Initializer or Constructor __init__
:
- Constructor (Yapıcı) Metod, bir sınıfın örneği oluşturulduğunda otomatik olarak çağrılan ve örneğin başlangıç durumunu ayarlayan özel bir metottur.
- Bu metod, sınıfın özelliklerine başlangıç değerleri atamak için kullanılır.
class Araba:
def __init__(self, marka, model, renk):
print("Constructor çalıştı")
self.marka = marka
self.model = model
self.renk = renk
araba1 = Araba("Ford", "Mustang", "Mavi") # Araba sınıfından bir örnek oluşturuyoruz.
print(araba1.marka)
print(araba1.model)
print(araba1.renk)
Constructor çalıştı
Ford
Mustang
Mavi
Self:
self
, sınıfın kendisini temsil eder ve bir sınıfın örneğini temsil eden bir referanstır.self
, sınıf içindeki diğer metodlara ve niteliklere (değişkenlere) erişim sağlar.
python
class Matematik:
def topla(self, sayi1, sayi2):
return sayi1 + sayi2
def cikar(self, sayi1, sayi2):
return sayi1 - sayi2
def carp(self, sayi1, sayi2):
return sayi1 * sayi2
def bol(self, sayi1, sayi2):
return sayi1 / sayi2
matematik = Matematik() # Matematik sınıfından bir örnek oluşturuyoruz.
Burada Matematik
sınıfı, temel matematik işlemlerini gerçekleştiren metotlara sahiptir ve self
anahtar kelimesi sayesinde bu metotlar, sınıfın özelliklerine erişebilir.
Matematik Sınıfı ve İşlemleri
Nesne yönelimli programlamada, Matematik
sınıfı gibi yapılar, işlevsellikleri ve verileri tek bir yapı altında gruplamak için kullanılır. Bu yapı, kodun yeniden kullanılabilirliğini ve organizasyonunu artırır.
print("Toplam = " + str(matematik.topla(2, 5)))
Toplam = 7
Bu örnekte, Matematik
sınıfının topla
metodunu kullanarak iki sayının toplamını hesaplıyoruz.
class Matematik:
def __init__(self, sayi1, sayi2):
self.sayi1 = sayi1
self.sayi2 = sayi2
def topla(self):
return self.sayi1 + self.sayi2
def cikar(self):
return self.sayi1 - self.sayi2
def carp(self):
return self.sayi1 * self.sayi2
def bol(self):
return self.sayi1 / self.sayi2
Bu sınıf, matematiksel işlemleri gerçekleştiren metodlara sahip bir Matematik
sınıfı tanımlar. Her bir metod, sınıfın örneklerine (instances) ait özellikleri (attributes) kullanır.
matematik2 = Matematik(2, 5)
Bu kod, Matematik
sınıfından bir örnek oluşturur.
print("Toplam = " + str(matematik2.topla()))
Toplam = 7
Bu kod, Matematik
sınıfının bir örneğini kullanarak iki sayının toplamını yazdırır.
Araba Sınıfı ve Metotları
OOP'de, Araba
sınıfı gibi yapılar, gerçek dünya nesnelerini modellemek için kullanılır. Sınıfların özellikleri (attributes) ve davranışları (methods) vardır.
class Araba:
# attributes
def __init__(self, marka, model, renk):
self.marka = marka
self.model = model
self.renk = renk
# methods
def tanit(self):
print(f"Araba; {self.marka}, {self.model}, {self.renk} renkte bir arabadır.")
araba1 = Araba("Ford", "Mustang", "Mavi") # Bir Araba örneği oluşturuluyor.
araba1.tanit()
Araba; Ford, Mustang, Mavi renkte bir arabadır.
Bu kod, Araba
sınıfının bir örneğini oluşturur ve bu örneğin tanit
metodunu kullanarak araba hakkında bilgi yazdırır.
Kitap Sınıfı ve Metotları
Benzer şekilde, Kitap
sınıfı da kitapla ilgili bilgileri saklayabilir ve bu bilgilere ilişkin işlemleri gerçekleştirebilir.
class Kitap:
# Attributes
def __init__(self, baslik, yazar, sayfa_sayisi):
self.baslik = baslik
self.yazar = yazar
self.sayfa_sayisi = sayfa_sayisi
# Methods
def tanit(self):
print(f"'{self.baslik}' adlı kitap, {self.yazar} tarafından yazılmıştır.")
def sayfa_ekle(self, sayfa):
self.sayfa_sayisi += sayfa
print(f"{self.baslik} adlı kitaba {sayfa} sayfa eklendi. Toplam sayfa sayısı {self.sayfa_sayisi}")
kitap1 = Kitap("Python Programlama Rehberi", "Ahmet Mehmet", 300)
kitap1.tanit()
kitap1.sayfa_ekle(50)
'Python Programlama Rehberi' adlı kitap, Ahmet Mehmet tarafından yazılmıştır.
Python Programlama Rehberi adlı kitaba 50 sayfa eklendi. Toplam sayfa
sayısı 350
Inheritance - Miras Alma
Miras alma (inheritance), sınıflar arasında kod yeniden kullanılabilirliğini sağlar. Bir sınıf, başka bir sınıfın özelliklerini ve davranışlarını miras alabilir.
class Asker():
def __init__(self, isim, rütbe):
self.isim = isim
self.rütbe = rütbe
self.güç = 100
def hareket_et(self):
print('hareket ediliyor...')
def puan_kazan(self):
print('puan kazanıldı')
def puan_kaybet(self):
print('puan kaybedildi')
# İşçi ve Yönetici sınıfları da benzer şekilde tanımlanabilir ve Asker sınıfının özelliklerini miras alabilir.
asker1 = Asker("Ahmet", "er")
print(asker1.güç)
100
asker1.hareket_et()
hareket ediliyor...
Bu kısımlar, nesne yönelimli programlamanın temel kavramlarını ve Python'da sınıfların nasıl kullanıldığını özetlemektedir.
Base Classes, Super Class
Nesne yönelimli programlamada, taban sınıflar (base classes) veya süper sınıflar (super classes), diğer sınıflar için temel işlevselliği ve özellikleri sağlar. Alt sınıflar (subclasses), bu taban sınıflardan miras alarak bu özellikleri ve metodları kullanabilir ve genişletebilir.
# Taban Sınıf
class Oyuncu:
def __init__(self, isim, rütbe):
self.isim = isim
self.rütbe = rütbe
self.güç = 0
def hareket_et(self):
print('hareket ediliyor...')
def puan_kazan(self):
print('puan kazanıldı')
def puan_kaybet(self):
print('puan kaybedildi')
Yukarıdaki Oyuncu
sınıfı, diğer sınıfların miras alabileceği temel bir yapı sağlar.
class Asker(Oyuncu): # Yukarıdaki taban sınıftan türeyen Alt Sınıf
pass
Asker
sınıfı, Oyuncu
taban sınıfından miras alır ve Oyuncu
sınıfının tüm özelliklerine ve metodlarına erişim sağlar.
asker1 = Asker("Ahmet", "Er")
print(asker1.rütbe) # 'Er'
print(asker1.güç) # 0
asker1.hareket_et() # 'hareket ediliyor...'
Asker
sınıfının bir örneği oluşturulduğunda, Oyuncu
sınıfından miras alınan özellikler ve metodlar kullanılabilir.
class İşçi(Oyuncu):
pass
class Yönetici(Oyuncu):
pass
İşçi
ve Yönetici
sınıfları da, Oyuncu
sınıfından miras alır ve bu sınıfın özelliklerini ve metodlarını içerirler.
asker1 = Asker('Ahmet', 'Er')
işçi1 = İşçi('Mehmet', 'Usta')
yönetici1 = Yönetici('Selim', 'Müdür')
Bu kod, Asker
, İşçi
ve Yönetici
sınıflarının örneklerini oluşturur ve bu örnekler üzerinden Oyuncu
sınıfından miras alınan metodları çağırabilir.
asker1.hareket_et() # 'hareket ediliyor...'
işçi1.puan_kaybet() # 'puan kaybedildi'
yönetici1.puan_kazan() # 'puan kazanıldı'
Bu kodlar, miras alınan metodların, alt sınıfların örnekleri üzerinden nasıl kullanılabileceğini gösterir. Miras almanın avantajı, kod tekrarını önlemek ve alt sınıfların, üst sınıfların sağladığı işlevselliği doğrudan kullanabilmesidir.
Miras alınan sınıflar, alt sınıflar tarafından değiştirilebilir (override) veya genişletilebilir. Bu, alt sınıfların, belirli ihtiyaçlara göre özelleştirilmesini sağlar. Ancak, miras alınan sınıfın özelliklerini ve metodlarını doğrudan değiştirmeden önce, alt sınıfın gerçekten bu değişikliklere ihtiyaç duyup duymadığını dikkatlice değerlendirmek önemlidir.
Miras Alınan Sınıfın Bütün Nitelik ve Metotları Alt Sınıfa Olduğu Gibi Devredilir.
Bir alt sınıf, üst sınıftan tüm özellik ve metotları miras alır. Bu, alt sınıfın üst sınıfın tüm işlevlerine ve verilerine sahip olduğu anlamına gelir.
class Asker(Oyuncu):
pass
Bu durumda, Asker
sınıfı, Oyuncu
sınıfından tüm özellikleri ve metotları miras alır.
Miras Alınan Sınıfın Bazı Nitelik ve Metotları Alt Sınıfta Yeniden Tanımlanır.
Alt sınıflar, bazen üst sınıfın özelliklerini veya metotlarını değiştirmek ister. Bu durumda, alt sınıf üst sınıfın metotlarını veya özelliklerini override edebilir.
class Asker(Oyuncu):
memleket = "Konya"
Bu örnekte, Asker
sınıfı Oyuncu
sınıfından miras alırken, aynı zamanda memleket
isimli yeni bir özellik eklemiştir.
asker = Asker("Ahmet", "Binbaşı")
print(asker.memleket) # 'Konya'
Asker
sınıfının bir örneği oluşturulduğunda, bu yeni özellik kullanılabilir.
Super()
super()
fonksiyonu, bir alt sınıfın üst sınıfının metotlarını ve özelliklerini çağırmasını sağlar. Bu, özellikle alt sınıfın üst sınıfın __init__
metodunu çağırması gerektiğinde önemlidir.
class Asker(Oyuncu):
def __init__(self, isim, rütbe):
super().__init__(isim, rütbe) # Üst sınıfın __init__ metodunu çağırır.
self.güç = 100 # Ek özellikler ekler.
Bu örnekte, Asker
sınıfı, Oyuncu
sınıfının __init__
metodunu super()
ile çağırarak isim
ve rütbe
özelliklerini miras alır ve ek olarak güç
özelliğini tanımlar.
asker = Asker("Ahmet", "Binbaşı")
print(asker.isim) # 'Ahmet'
print(asker.rütbe) # 'Binbaşı'
print(asker.güç) # 100
Asker
sınıfının bir örneği oluşturulduğunda, Oyuncu
sınıfından miras alınan özelliklere ek olarak güç
özelliği de atanmış olur.
Özel Durumlar ve Genişletmeler
Alt sınıflar, miras aldıkları metotları yeniden tanımlayarak özelleştirebilir. Bu, alt sınıfların belirli ihtiyaçlarını karşılamak için üst sınıfın işlevselliğini genişletmesine olanak tanır.
class Asker(Oyuncu):
def __init__(self, isim, rütbe):
super().__init__(isim, rütbe)
self.güç = 100
def hareket_et(self):
super().hareket_et()
print('hedefe ulaşıldı.')
Bu kod, Asker
sınıfının hareket_et
metodunu Oyuncu
sınıfının metodunu çağırarak ve ek bir mesaj yazdırarak genişletir.
asker2 = Asker("Mehmet", "Er")
asker2.hareket_et() # 'hareket ediliyor...' ve 'hedefe ulaşıldı.'
Asker
sınıfı, Oyuncu
sınıfının hareket_et
metodunu gen
işleterek, askerin hareket ettiğini ve hedefe ulaştığını belirten ek çıktılar üretir.