Kalıtım (Inheritance), nesne tabanlı programlamada bir sınıfın başka bir sınıftan özelliklerini (metotlar ve değişkenler) miras almasını sağlayan bir mekanizmadır. Bu, kodun yeniden kullanılabilirliğini artırır ve kodun düzenli ve temiz olmasını sağlar.
Kalıtım, bir "alt sınıf" veya "türetilmiş sınıf" oluşturarak gerçekleştirilir. Alt sınıf, "üst sınıf" veya "temel sınıf" olarak adlandırılan başka bir sınıftan özellikler alır. Alt sınıf, üst sınıfın tüm özelliklerine sahip olur ve genellikle kendi özelliklerini de ekler veya üst sınıfın bazı özelliklerini değiştirir veya genişletir.
Python'da kalıtım, alt sınıfın tanımlanırken parantez içinde üst sınıfın adının belirtilmesiyle gerçekleştirilir:
class BaseClass: pass class DerivedClass(BaseClass): pass
Bu örnekte, DerivedClass adlı bir sınıf, BaseClass adlı başka bir sınıftan kalıtım yapar. Bu, DerivedClass'ın BaseClass'ın tüm özelliklerine sahip olacağı anlamına gelir.
Kalıtım, daha genel bir sınıftan daha özel sınıflar oluşturmanıza olanak sağlar. Örneğin, bir "Hayvan" sınıfınız varsa, bu sınıftan "Köpek" ve "Kedi" gibi daha özel sınıflar oluşturabilirsiniz. Bu sınıflar, "Hayvan" sınıfının tüm özelliklerine sahip olacak ve muhtemelen kendi özel özelliklerini de ekleyecektir.
"Override" ve "extend" terimleri, genellikle nesne tabanlı programlamada ve özellikle kalıtım (inheritance) bağlamında kullanılır.
Override (Geçersiz Kılma): Bir alt sınıf, üst sınıftan miras aldığı bir metodu geçersiz kılabilir. Bu, alt sınıfın aynı isimli bir metot tanımlaması ve bu metotun üst sınıftaki metotla aynı ismi taşımasına rağmen farklı bir işlevi olması anlamına gelir. Bu, alt sınıfın belirli bir işlemi üst sınıftan farklı bir şekilde gerçekleştirmesini sağlar.
Python'da bir metodu geçersiz kılmak, aynı isimli bir metot tanımlamak kadar basittir:
class BaseClass: def my_method(self): print("BaseClass method") class DerivedClass(BaseClass): def my_method(self): # This overrides the method in BaseClass print("DerivedClass method")
Extend (Genişletme): Bir alt sınıf, üst sınıftan miras aldığı işlevselliği genişletebilir. Bu, alt sınıfın yeni metotlar eklemesi veya mevcut metotları genişletmesi anlamına gelir. Genişletme, genellikle bir metodu geçersiz kılmak ve sonra aynı metot içinde super() fonksiyonunu kullanarak üst sınıfın metotunu çağırmak şeklinde gerçekleşir. Bu, alt sınıfın üst sınıfın işlevselliğini korurken ek işlevsellik eklemesini sağlar.
Python'da bir metodu genişletmek aşağıdaki gibi olabilir:
class BaseClass: def my_method(self): print("BaseClass method") class DerivedClass(BaseClass): def my_method(self): # This extends the method in BaseClass super().my_method() print("DerivedClass extension")
Bu örnekte, DerivedClass'ın my_method metodu, BaseClass'ın my_method metodunu genişletir. İlk olarak üst sınıfın metodu çağrılır, ardından ek bir işlevsellik eklenir. Bu, "BaseClass method" ve "DerivedClass extension" çıktılarının her ikisinin de yazdırılmasını sağlar.
Name Resolution: Python'da, bir ismin (değişken, fonksiyon, sınıf, modül vb.) neyi ifade ettiğini belirlemek için bir isim çözümlemesi (name resolution) süreci vardır. Python, bir ismi çözümlemek için yerel kapsamdan (local scope) başlar, sonra kapsayan kapsamlara (enclosing scopes), sonra global kapsama (global scope) ve en sonunda yerleşik kapsama (built-in scope) bakar. Bu sürece LEGB kuralı denir (Local, Enclosing, Global, Built-in).
Örneğin, bir fonksiyon içinde bir değişken adını kullanırsanız, Python önce bu değişkenin fonksiyonun yerel kapsamında tanımlanıp tanımlanmadığına bakar. Eğer yerel kapsamda tanımlanmamışsa, kapsayan kapsamlara, sonra global kapsama ve en sonunda yerleşik kapsama bakar.
Dynamic Dispatch: Dinamik gönderme (dynamic dispatch), bir metot çağrısının hangi metot gövdesini (method body) kullanacağının çalışma zamanında (runtime) belirlenmesi sürecidir. Bu, özellikle nesne yönelimli programlamada ve özellikle de kalıtım (inheritance) ve polimorfizm (polymorphism) ile ilişkilidir.
Bir alt sınıfın, üst sınıftan miras aldığı bir metodu geçersiz kılması (override) durumunda, hangi metot gövdesinin kullanılacağına karar vermek için dinamik gönderme kullanılır. Python'da, bir metot çağrısı her zaman örneğin (instance) gerçek türüne (yani, hangi sınıfın örneği olduğuna) bağlıdır, bu da dinamik göndermeyi sağlar.
Örneğin, bir Dog sınıfınız var ve bu sınıf, Animal sınıfından make_sound metotunu miras alıyor. Ancak, Dog sınıfı bu metodu "Woof!" çıktısını veren bir metotla geçersiz kılıyor. Bu durumda, Dog sınıfının bir örneği üzerinde make_sound metotunu çağırdığınızda, Python dinamik gönderme kullanarak Dog sınıfının make_sound metodunu çağırır.
Aşağıda, Python'da Dynamic Dispatch'i gösteren basit bir örnek bulunmaktadır.
class Hayvan: def ses_cikar(self): print("Hayvan sesi çıkarır.") class Kopek(Hayvan): def ses_cikar(self): print("Hav hav!") class Kedi(Hayvan): def ses_cikar(self): print("Miyav!") def hayvanin_sesini_dinle(hayvan): hayvan.ses_cikar() kopek = Kopek() kedi = Kedi() hayvanin_sesini_dinle(kopek) # Çıktı: Hav hav! hayvanin_sesini_dinle(kedi) # Çıktı: Miyav!
Aşağıda, __init__ metodunun kalıtım ile nasıl kullanılabileceğine dair bir örnek bulunmaktadır.
class Hayvan: def __init__(self, ad): self.ad = ad print(f"{ad} bir hayvandır.") class Kopek(Hayvan): def __init__(self, ad, cins): super().__init__(ad) # Üst sınıfın __init__ metodunu çağırır self.cins = cins print(f"{ad}, bir {cins} cinsi köpektir.") kopek = Kopek("Karabaş", "Kangal")
Bu kodun çıktısı:
Karabaş bir hayvandır. Karabaş, bir Kangal cinsi köpektir.
0 Comments
Recommended Comments
There are no comments to display.