Python 3'te Sınıf Mirasını Anlamak
Giriş
Nesne yönelimli programlama, geliştirme projelerindeki tekrarı azaltmak için yeniden kullanılabilir kod kalıpları oluşturur. Nesne yönelimli programlamanın bu yeniden kullanılabilir kodu sağlamasının bir yolu, bir alt sınıfın başka bir temel sınıfın kodundan yararlanabildiği inheritance (kalıtım) yoluyla olur.
Bu eğitimde, Python'da kalıtımın temel yönlerini inceleyeceğiz. Bunlar arasında ebeveyn ve çocuk sınıflarının nasıl çalıştığı, yöntemlerin ve özelliklerin nasıl geçersiz kılındığı, super()
fonksiyonunun nasıl kullanıldığı ve çoklu kalıtımdan nasıl yararlanılacağı yer alır.
Kalıtım Nedir?
Kalıtım, bir sınıfın başka bir sınıf içinde oluşturulmuş kodu kullanmasıdır. Biyoloji bağlamında düşünecek olursak, bir çocuğun ebeveyninden bazı özellikleri miras alması gibi düşünülebilir. Örneğin, bir çocuk ebeveyninin boyunu veya göz rengini miras alabilir. Ayrıca çocuklar ebeveynleriyle aynı soyadı da paylaşabilir.
Child classes (çocuk sınıflar) veya subclasses (alt sınıflar), parent classes (ebeveyn sınıflar) veya base classes (temel sınıflar) yöntemlerini ve değişkenlerini miras alır.
Bir Parent
adlı ebeveyn sınıfımız olduğunu ve bunun last_name
, height
ve eye_color
gibi sınıf değişkenleri barındırdığını varsayalım. Bu özellikler Child
adlı çocuk sınıfına miras kalır.
Çocuk alt sınıf, temel sınıfın kodunu miras aldığı için bu kodu yeniden kullanabilir ve böylece programcı daha az satır kod yazarak tekrarı azaltır.
Ebeveyn Sınıflar
Ebeveyn veya temel sınıflar, çocuk veya alt sınıfların temel alabileceği bir kalıp oluşturur. Ebeveyn sınıflar, kodu tekrar tekrar yazmadan alt sınıflar oluşturmamıza olanak tanır. Herhangi bir sınıf bir ebeveyn sınıf haline getirilebilir, bu nedenle sadece birer şablon değil, kendi başlarına tamamen işlevsel sınıflardır.
Örneğin, bir genel Bank_account
(Banka hesabı) ebeveyn sınıfımız olduğunu ve bunun Personal_account
(Bireysel hesap) ve Business_account
(İşletme hesabı) çocuk sınıflarını içerdiğini varsayalım. Bireysel ve işletme hesapları arasındaki para çekme ve yatırma gibi yöntemler benzer olduğundan, bunlar Bank_account
ebeveyn sınıfına ait olabilir. İşletme hesabı alt sınıfı ise, işletme kayıtları ve belgeleri toplama gibi özel yöntemlere sahip olabilir ve ayrıca bir employee_identification_number
değişkeni barındırabilir.
Benzer şekilde, bir Animal
(Hayvan) sınıfı eating()
(yemek yeme) ve sleeping()
(uyuma) yöntemlerine sahip olabilirken, bir Snake (Yılan) alt sınıfı kendi özgün hissing()
(tıslama) ve slithering()
(sürünme) yöntemlerine sahip olabilir.
Şimdi, bir Fish
(Balık) ebeveyn sınıfı oluşturalım ve bunu daha sonra alt sınıfları olarak türler oluşturmak için kullanalım. Bu balıkların her biri ad ve soyadı ile birlikte çeşitli özelliklere sahip olacaktır.
Bilgi: Bu eğitimdeki örnek kodu takip etmek için, python3
komutunu çalıştırarak yerel sisteminizde bir Python etkileşimli kabuğu açın. Daha sonra örnekleri >>>
isteminden sonra ekleyerek kopyalayabilir, yapıştırabilir veya düzenleyebilirsiniz.
fish.py
adında yeni bir dosya oluşturacağız ve her Fish nesnesi veya alt sınıfı için first_name
ve last_name
sınıf değişkenleriyle dolduracağımız __init__()
oluşturucu yöntemiyle başlayacağız.
class Fish:
def __init__(self, first_name, last_name="Fish"):
self.first_name = first_name
self.last_name = last_name
last_name
değişkenini "Fish"
değeriyle başlatıyoruz çünkü çoğu balığın bu soyadı taşıyacağını varsayıyoruz.
Ek olarak bazı yöntemler ekleyelim:
class Fish:
def __init__(self, first_name, last_name="Fish"):
self.first_name = first_name
self.last_name = last_name
def swim(self):
print("The fish is swimming.")
def swim_backwards(self):
print("The fish can swim backwards.")
swim()
ve swim_backwards()
metodlarını Fish
sınıfına ekledik
Fish
sınıfına swim()
ve swim_backwards()
metodlarını ekledik, böylece bu sınıftan türeyen tüm alt sınıflar bu metodları kullanabilecek.
Çoğu balık kemikli balık (yani iskeleti kemikten oluşan balıklar) olarak kabul edildiğinden, __init__()
metoduna birkaç ek özellik daha ekleyebiliriz:
class Fish:
def __init__(self, first_name, last_name="Fish", skeleton="bone", eyelids=False):
self.first_name = first_name
self.last_name = last_name
self.skeleton = skeleton
self.eyelids = eyelids
def swim(self):
print("Balık yüzüyor.")
def swim_backwards(self):
print("Balık geriye doğru yüzebiliyor.")
Alt Sınıflar
Alt sınıflar, bir üst sınıftan miras alan sınıflardır. Bu, her alt sınıfın üst sınıfın metodlarını ve değişkenlerini kullanabileceği anlamına gelir.
Örneğin, Fish
sınıfından türeyen bir Goldfish
alt sınıfı, Fish
sınıfında tanımlanan swim()
metodunu kullanabilir.
Her alt sınıfın, hangi sınıftan türediğini belirtmek için üst sınıfı parametre olarak alması gerekir:
class Trout(Fish):
pass
Artık herhangi bir ek metod tanımlamadan bir Trout
nesnesi oluşturabiliriz:
terry = Trout("Terry")
print(terry.first_name + " " + terry.last_name)
print(terry.skeleton)
print(terry.eyelids)
terry.swim()
terry.swim_backwards()
Bu program çalıştırıldığında şu çıktıyı alacağız:
Terry Fish
bone
False
Balık yüzüyor.
Balık geriye doğru yüzebiliyor.
Kendi Metoduna Sahip Yeni Bir Alt Sınıf Oluşturma
Şimdi, Clownfish
adlı bir sınıf oluşturup, deniz şakayığıyla birlikte yaşayabilen özel bir metot ekleyelim:
class Clownfish(Fish):
def live_with_anemone(self):
print("Palyaço balığı deniz şakayığı ile birlikte yaşıyor.")
Bir Clownfish
nesnesi oluşturup nasıl çalıştığını görelim:
casey = Clownfish("Casey")
print(casey.first_name + " " + casey.last_name)
casey.swim()
casey.live_with_anemone()
Bu program çalıştırıldığında şu çıktıyı alacağız:
Casey Fish
Balık yüzüyor.
Palyaço balığı deniz şakayığı ile birlikte yaşıyor.
Eğer bir Trout
nesnesinde live_with_anemone()
metodunu kullanmaya çalışırsak, hata alırız:
terry.live_with_anemone()
AttributeError: 'Trout' nesnesinin 'live_with_anemone' adlı bir özelliği yok
Bu hatanın nedeni, live_with_anemone()
metodunun sadece Clownfish
alt sınıfına ait olmasıdır, Fish
üst sınıfına değil.
Alt sınıflar, ait oldukları üst sınıfın metodlarını miras alır, böylece programlar içinde bu metodları kullanabilirler.
Lisa Tagliaferri tarafından yazılan Understanding Class Inheritance in Python 3 Program makalesinin düzenlenmiş çevirisi.
Daha Fazla Oku:
- Sonraki Makale: Python 3'te Sınıflara Çok Biçimlilik (Polymorphism) Nasıl Uygulanır?
- Önceki Makale: Python 3'te Sınıf ve Örnek Değişkenlerini Anlama