0
user Programlama Akademi
17-01-2025 5:09 PM
Python

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:


Bu Makaleyi Paylaş

Yorumlar

yorum Yap