3 - Kalıtım (Inheritance)
2025
Kalıtım (Inheritance): - Mevcut bir sınıfın (taban/ebeveyn) özelliklerini ve metotlarını devralarak yeni sınıflar (alt/süreç) oluşturma mekanizması.
Taban Sınıf (Superclass / Base Class): - Ortak özellik ve metotların tanımlandığı sınıf.
Alt Sınıf (Subclass / Derived Class): - Taban sınıftan miras alır; ek özellik veya davranış eklenebilir.
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
# Taban sınıf örneği:
p = Person("John", "Doe")
p.printname() # Çıktı: John Doe
# Student sınıfı; Person'dan miras alıyor.
class Student(Person):
pass
s = Student("Ali", "Veli")
s.printname() # Çıktı: Ali Veli
Alt sınıfın init() metodunu yeniden tanımlarken, taban sınıfın özelliklerini kaybetmemek için init() metodunu çağırmalıyız.
Alt sınıfın ebeveyninden tüm metotları ve nitelikleri miras almasını sağlayacak bir super()
işlevine de sahiptir:
class Student(Person):
def __init__(self, fname, lname, year):
super().__init__(fname, lname)
self.graduationyear = year
s = Student("Ali", "Veli", 2023)
s.printname() # Çıktı: Ali Veli
print(s.graduationyear) # Çıktı: 2023
super()
işlevini kullanarak, taban sınıfın adını kullanmak zorunda kalmazsınız. Metotlar ve nitelikler otomatik olarak ebeveynden devralır.
Parametre listesini tekrardan yazmaktan kaçınmak için:
Method overriding, alt sınıfın, taban sınıfta tanımlı bir metodu aynı isimle yeniden tanımlayarak, kendi davranışını oluşturmasıdır.
Alt sınıf nesnesi için aynı isimli metot çağrıldığında, taban sınıfın metodu yerine alt sınıfta tanımlanan metot çalışır.
Örnek:
Her alt sınıf, taban sınıfın init() metodunu super() ile çağırarak kendi güç değerini belirler.
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ı.')
class İşçi(Oyuncu):
def __init__(self, isim, rütbe):
super().__init__(isim, rütbe)
self.güç = 70
class Yönetici(Oyuncu):
def __init__(self, isim, rütbe):
super().__init__(isim, rütbe)
self.güç = 50
Kullanım:
asker = Asker('Ahmet', 'Binbaşı')
işçi = İşçi('Mehmet', 'Usta')
yönetici = Yönetici('Selim', 'Müdür')
print(asker.isim, asker.rütbe, asker.güç) # Çıktı: Ahmet Binbaşı 100
asker.hareket_et() # Çıktı: hareket ediliyor...
# hedefe ulaşıldı.
işçi.puan_kaybet() # Çıktı: puan kaybedildi
yönetici.puan_kazan() # Çıktı: puan kazanıldı
Python’da bir sınıf birden fazla sınıftan miras alabilir. Bu durumda, Method Resolution Order (MRO), bir nesnenin metotlarını veya niteliklerini ararken hangi sırayla hangi sınıflara bakılacağını belirler.
Miras alma sürecinde üç senaryo görülebilir:
Olduğu Gibi Aktarma: Alt sınıf hiçbir ekleme yapmadan pass
kullanır.
Yeniden Tanımlama (Overriding): Alt sınıf, taban sınıftaki metodu kendine göre yeniden yazar.
Yeni Nitelik ve Metot Eklemek: Alt sınıfa ek özellikler eklenir (örneğin, memleket
gibi).
Eğer alt sınıfta, taban sınıfta tanımlı bir nitelik veya metot yeniden tanımlanırsa, alt sınıftakiler geçerli olur.
super() fonksiyonunu yalnızca init() içinde değil, diğer metotlar içinde de kullanabilirsiniz. Böylece taban sınıfın metotları üzerinde ek işlevsellik katabilirsiniz.
Person
adlı bir taban sınıf oluşturun. Bu sınıfın printname()
metodu ve isim, soyisim nitelikleri olsun. Ardından, Teacher
adlı bir alt sınıf türeterek, printname()
metodunu ezip ek olarak öğretmenin branşını da ekrana yazdırın.Vehicle
adında bir taban sınıf oluşturun. Bu sınıfta start()
metodu tanımlayın. Ardından, Car
ve Boat
adında iki alt sınıf türeterek, her biri için start()
metodunu kendine has şekilde ezip, her iki sınıfı da miras alan AmphibiousVehicle
adlı bir sınıf oluşturun.
super()
kullanarak hangi metodun çağrıldığını kontrol edin.Player
adlı bir taban sınıf oluşturun. Ardından, Warrior
, Mage
ve Archer
adında alt sınıflar tanımlayın.