Python kalıtım, bir sınıfın başka bir sınıfta bulunan ortak özellik ve metotları yeniden yazmadan kullanmasını ve kendi özel davranışlarını eklemesini sağlar. Üst sınıf ortak yapıyı tanımlar, alt sınıf bu yapıyı devralarak daha özel bir amaç için genişletir.
Bunu kurmak için alt sınıf tanımında üst sınıf parantez içine yazılır: class AltSinif(UstSinif):. Alt sınıf, miras aldığı metotları doğrudan kullanabilir, aynı adlı bir metodu yeniden tanımlayabilir veya super() ile üst sınıftaki davranışa kendi davranışını ekleyebilir.
Kalıtımda üst sınıf ve alt sınıf ilişkisi nasıl kurulur?

“Kalıtım, alt sınıfın üst sınıfın davranışını devralıp onu daha özel bir davranışla genişletmesi için kullanılır.” Bu ilişkide ortak özellik ve davranışlar üst sınıfta toplanır. Alt sınıf ise bu temel yapıyı alır, gerektiğinde yeni özellikler veya metotlar ekler.
Örneğin Arac sınıfı hareket etme davranışını tanımlayabilir. Bisiklet sınıfı da bir araç türü olarak bu davranıştan yararlanabilir. Burada Arac üst sınıf, Bisiklet ise alt sınıftır. “Bisiklet bir araçtır” cümlesi, nesne yönelimli programlamadaki is-a ilişkisini açıklar.
Üst sınıf, alt sınıfların ortak temelini temsil etmelidir. Alt sınıfın üst sınıftan tamamen farklı bir kavramı ifade ettiği durumlarda kalıtım yapay bir ilişki oluşturabilir. Bu nedenle kalıtım yalnızca aynı kodu tekrar yazmamak için seçilmemelidir.
Kalıtım kullanmadan önce şu kontrol listesini uygulayabilirsin:
- Alt sınıf, üst sınıfın bir türünü mü temsil ediyor?
- İki sınıf arasında paylaşılacak ortak davranışlar var mı?
- Alt sınıf, üst sınıfın anlamını bozmadan yeni davranışlar ekleyebiliyor mu?
Bu sorulara net yanıt verilemiyorsa yalnızca kodu kısaltmak için kalıtım kullanmak yerine sınıflar arasındaki ilişkiyi yeniden değerlendirmek daha sağlıklı olur.
class AltSinif(UstSinif) sözdizimi, ortak davranış ve super()
class AltSinif(UstSinif): sözdiziminde parantez içindeki sınıf, miras alınan üst sınıftır. Aşağıdaki örnekte Bisiklet, Arac sınıfının hareket_et() metodunu doğrudan kullanır.
class Arac:
def hareket_et(self):
print("Araç hareket ediyor.")
class Bisiklet(Arac):
pass
bisiklet = Bisiklet()
bisiklet.hareket_et()
Beklenen çıktı Araç hareket ediyor. olur. Bisiklet içinde bu metot yazılmamış olsa da alt sınıf, üst sınıftan miras aldığı davranışı çağırabilir.
Alt sınıf aynı adlı metodu kendi içinde tanımlarsa üst sınıftaki davranışı geçersiz kılar. Bu işleme metot geçersiz kılma veya yeniden tanımlama denir. super() ise üst sınıftaki aynı metodu çağırarak mevcut davranışı korumaya yardımcı olur.
class Arac:
def tanit(self):
print("Bu bir araçtır.")
class Bisiklet(Arac):
def tanit(self):
super().tanit()
print("Bu araç iki tekerleklidir.")
Bisiklet().tanit()
Beklenen çıktı önce Bu bir araçtır., ardından Bu araç iki tekerleklidir. olur. Böylece alt sınıf, üst sınıftaki davranışı tamamen silmek yerine onun üzerine yeni bir davranış ekler.
super().__init__() kullanımı, alt sınıfa yeni özellikler eklerken üst sınıfın kurucusunu da çalıştırmak için kullanılır.
class Kisi:
def __init__(self, ad):
self.ad = ad
class Ogrenci(Kisi):
def __init__(self, ad, seviye):
super().__init__(ad)
self.seviye = seviye
ogrenci = Ogrenci("Deniz", "Başlangıç")
print(ogrenci.ad)
print(ogrenci.seviye)
Beklenen çıktı Deniz ve Başlangıç olur. super().__init__(ad) çağrısı, ad özelliğini üst sınıfta oluşturur; alt sınıf da buna ek olarak seviye özelliğini tanımlar.
Kalıtım, metotların hangi sınıftan geldiğini takip ederek çalışıldığında daha anlaşılır hâle gelir. Konuyu yapılandırılmış biçimde ilerletmek için birebir Python dersleri kapsamında ortak davranış, metot geçersiz kılma ve super() kullanımı uygulamalı olarak ele alınabilir.
Kullanıcı ve Yönetici sınıflarıyla çalışan Python kalıtım örneği

Kalıtım, alt sınıfın üst sınıfın davranışını devralıp onu daha özel bir davranışla genişletmesi için kullanılır. Kullanıcı ve yönetici ilişkisi bu yapıyı anlamak için uygun bir örnektir. Her iki nesnenin de adı ve e-posta adresi bulunur. Yönetici nesnesine ise ayrıca bir yetki bilgisi eklenir.
class Kullanici:
def __init__(self, ad, eposta):
self.ad = ad
self.eposta = eposta
def tanit(self):
return f"{self.ad} ({self.eposta})"
class Yonetici(Kullanici):
def __init__(self, ad, eposta, yetki):
super().__init__(ad, eposta)
self.yetki = yetki
def tanit(self):
return f"{super().tanit()}, yetki: {self.yetki}"
kullanici = Kullanici("Ayşe", "[email protected]")
yonetici = Yonetici("Mehmet", "[email protected]", "rapor")
print(kullanici.tanit())
print(yonetici.tanit())
Beklenen çıktı
Ayşe ([email protected])
Mehmet ([email protected]), yetki: rapor
İlk olarak Kullanici sınıfı oluşturulur. Bu sınıfın başlatıcısı olan __init__() metodu, ad ve eposta özelliklerini tanımlar. tanit() metodu da bu iki özelliği kullanarak ortak tanıtım metnini üretir.
Yonetici(Kullanici) ifadesi, Yonetici sınıfının Kullanici sınıfından kalıtım aldığını gösterir. Böylece yönetici nesnesi, üst sınıfta tanımlanan ad ve eposta özelliklerini kullanabilir. super().__init__(ad, eposta) çağrısı, bu iki özelliğin üst sınıf tarafından başlatılmasını sağlar. Alt sınıf kendi ek özelliği olan yetki bilgisini ayrıca tanımlar.
Yonetici sınıfında yeniden yazılan tanit() metodu, üst sınıftaki aynı adlı metodu geçersiz kılar. Buna rağmen ortak metin baştan yazılmaz. super().tanit() çağrısı, üst sınıftaki tanıtım metnini alır ve alt sınıf bu metne yetki bilgisini ekler. Böylece ortak davranış korunurken yöneticiye özgü davranış da genişletilmiş olur.
Bu örnekteki sınıf, özellik ve metot ilişkisini farklı değerlerle denemek ve temel Python bilgini ölçmek için Python bilgi testini kullanabilirsin.
Kalıtım yerine bileşim veya ayrı sınıf ne zaman seçilir?
Kalıtım, sınıflar arasında anlamlı bir tür ilişkisi olduğunda kullanışlıdır. Her iki sınıfta benzer birkaç özellik bulunması tek başına kalıtım için yeterli değildir. Karar verirken şu soruyu sor: Aynı tür mü, yalnızca birlikte mi çalışıyorlar?
Görev uygulaması üzerinden düşünelim. Bir Yonetici, kullanıcı hesabına, ada ve e-posta adresine sahip olduğu için bir Kullanici türü olarak değerlendirilebilir. Yöneticinin buna ek olarak görev atama veya rapor görüntüleme gibi yetkileri olabilir. Bu durumda kalıtım, ortak kullanıcı davranışlarını koruyup yöneticiye özel davranışlar eklemeyi kolaylaştırır.
Ancak Bildirim bir kullanıcı değildir. Bildirim, bir kullanıcıya gönderilen mesajı temsil eder ve kullanıcıyla birlikte çalışır. Raporlayici da kullanıcı değildir; kullanıcıların ve görevlerin verilerini kullanarak rapor oluşturur. Envanter ise görev uygulamasındaki kaynakları veya kayıtları yönetebilir, fakat kendisi bir kullanıcı hesabı değildir. Bu tür ilişkilerde bileşim veya bağımsız sınıf tasarımı daha açık olabilir. Örneğin bir bildirimin alıcısı olarak bir Kullanici nesnesi bulunabilir. Bu, bildirimin kullanıcıdan türediği değil, bir kullanıcıyla çalıştığı anlamına gelir.
Yalnızca kod tekrarını azaltmak kalıtım için yeterli bir gerekçe değildir. Alt sınıf, üst sınıfın temel davranışını anlamsızlaştırıyor veya üst sınıf için beklenen davranışları korumuyorsa ayrı bir yapı düşünülmelidir. Ortak işlemler az sayıdaysa yardımcı fonksiyonlar ya da bağımsız sınıflar da daha sade bir çözüm sunabilir.
Karar kontrol listesi
- Alt sınıf gerçekten üst sınıfın bir türü mü?
- Ortak davranışlar her iki sınıfta da anlamlı mı?
- Üst sınıf davranışı alt sınıfta korunuyor mu?
- İlişki aslında has-a veya uses-a türünde mi?
- Yalnızca kod tekrarı varsa yardımcı fonksiyon ya da bağımsız sınıf yeterli mi?
Sık Sorulan Sorular
super() Python kalıtımında neden kullanılır?
super(), alt sınıftan üst sınıfta bulunan metotlara erişmeyi sağlar. Özellikle üst sınıfın __init__() metodunu yeniden yazmadan kullanmak ve üst sınıftaki ortak davranışı alt sınıfın davranışına eklemek için tercih edilir.
Alt sınıf üst sınıfın metodunu nasıl geçersiz kılar?
Alt sınıf, üst sınıftaki metotla aynı ada sahip yeni bir metot tanımlar. Bu durumda alt sınıftan oluşturulan nesne, çağrı yapıldığında alt sınıftaki metodu kullanır. Ortak davranış korunmak istenirse bu metodun içinde super().metot_adi() çağrılabilir.
Kalıtım yalnızca kod tekrarını azaltmak için kullanılabilir mi?
Kullanılabilir, ancak yalnızca kod tekrarını azaltmak iyi bir gerekçe değildir. Sınıflar arasında anlamlı bir tür ilişkisi bulunmalı ve alt sınıf, üst sınıfın temel davranışlarıyla uyumlu çalışmalıdır. Bu ilişki yoksa yardımcı fonksiyon, bileşim veya bağımsız sınıf daha anlaşılır olabilir.
Kullanıcı ve Yönetici arasındaki ilişki neden kalıtıma uygun olabilir?
Yönetici, kullanıcıya ait temel özellikleri taşır ve kullanıcı davranışlarına ek olarak yetki bilgisi içerir. Bu nedenle yönetici, daha özel bir kullanıcı türü olarak modellenebilir. Yine de yöneticinin uygulamadaki davranışları kullanıcı davranışlarıyla uyumlu değilse ayrı bir tasarım değerlendirilmelidir.
Kalıtım kararını ortak kod miktarına göre değil, sınıflar arasındaki anlamlı ilişkiye göre vermek daha sağlıklı bir tasarım sağlar.