Nesne tabanlı programlamada soyutlama metodun gerçek işlevini gizleme işlemidir. Python’da bunu Soyutlama Sınıfı(ABC-Abstraction Class) ya da Soyutlama Metodu kullanarak yapabiliriz.
ABC sınıfı Python abc modülünün bir sınıfıdır. Oluşturacağımız sınıfı ABC() ile genişletirsek(extend) ve bir soyutlama metodu dahil edersek, bu sınıftan miras alınan sınıfların bu soyutlama metodunu kullanması gerekecektir.
Herhangi bir metodun başına @abstractmethod anahtar kelimesini eklersek bu metod soyut bir sınıf olur. İçinde herhangi bir işlev yer almayacaktır. Ana sınıfın bu şekilde bir soyut metodu var ise ve soyut bir sınıftan miras alınmamışsa, @abstractmethod kullanmak isteğe bağlıdır.
# Öncelikle abc modülünden soyutlama sınıfını ve metodunu ekleyelim from abc import ABC, abstractmethod # Soyut bir sınıf oluşturalım class SoyutOrnek(ABC): def __init__(kisi,ad,soyad, programlamaDili, deneyimSuresi): kisi.ad=ad kisi.soyad=soyad kisi.programlamaDili=programlamaDili kisi.deneyimSuresi=deneyimSuresi @abstractmethod def dilYazdir(kisi): pass # Soyut sınıftan miras alan bir sınıf oluşturalım class SunucuTarafiGelistirici(SoyutOrnek): def __init__(kisi, ad, soyad, programlamaDili, deneyimSuresi, konum, egitim): super().__init__(ad, soyad, programlamaDili, deneyimSuresi) kisi.konum=konum kisi.egitim=egitim # Miras ile türetilen sınıfımızdan bir nesne oluşturalım. personel=SunucuTarafiGelistirici("Buğra","Moralı",("NodeJS","PHP","Python"),9,"İzmir","Yazılım Mühendisi") # Bu nesne ile işlem gerçekleştirelim. print("Personel Ad-Soyad: " + personel.ad + " " + personel.soyad) print("Deneyim Süresi: " , personel.deneyimSuresi) print("Kullandığı Programlama Dilleri: ") personel.dilYazdir() print("Yaşadığı Şehir: " + personel.konum) print("Eğitim: " + personel.egitim)
Çıktı:
TypeError: Can't instantiate abstract class SunucuTarafiGelistirici with abstract methods dilYazdir
Gördüğünüz gibi çalıştırdığımızda soyut sınıfın metodunun başlatılamadığı ile ilgili bir hata veriyor. Çünkü, soyut bir sınıftan türetilen bir sınıf, tüm soyut metodları geçersiz kılınmadıkça başlatılamaz. Yani alt sınıfları oluşturan kişilerin aynı isimdeki metodları kendileri de yazması gereklidir.
# Öncelikle abc modülünden soyutlama sınıfını ve metodunu ekleyelim from abc import ABC, abstractmethod # Soyut bir sınıf oluşturalım class SoyutOrnek(ABC): def __init__(kisi,ad,soyad, programlamaDili, deneyimSuresi): kisi.ad=ad kisi.soyad=soyad kisi.programlamaDili=programlamaDili kisi.deneyimSuresi=deneyimSuresi @abstractmethod def dilYazdir(kisi): pass # Soyut sınıftan miras alan bir sınıf oluşturalım class SunucuTarafiGelistirici(SoyutOrnek): def __init__(kisi, ad, soyad, programlamaDili, deneyimSuresi, konum, egitim): super().__init__(ad, soyad, programlamaDili, deneyimSuresi) kisi.konum=konum kisi.egitim=egitim def dilYazdir(kisi): veriTuru=type(kisi.programlamaDili) if veriTuru is str: print(" - ", kisi.programlamaDili) elif veriTuru is tuple or list: for dil in kisi.programlamaDili: print(" - ", dil) else: print("Hatalı bir veri girişi yapılmış!") # Miras ile türetilen sınıfımızdan bir nesne oluşturalım. personel=SunucuTarafiGelistirici("Buğra","Moralı",("NodeJS","PHP","Python"),9,"İzmir","Yazılım Mühendisi") # Bu nesne ile işlem gerçekleştirelim. print("Personel Ad-Soyad: " + personel.ad + " " + personel.soyad) print("Deneyim Süresi: " , personel.deneyimSuresi) print("Kullandığı Programlama Dilleri: ") personel.dilYazdir() print("Yaşadığı Şehir: " + personel.konum) print("Eğitim: " + personel.egitim)
Çıktı:
Personel Ad-Soyad: Buğra Moralı Deneyim Süresi: 9 Kullandığı Programlama Dilleri: - NodeJS - PHP - Python Yaşadığı Şehir: İzmir Eğitim: Yazılım Mühendisi
Bir sınıfın soyut sınıf olması için en az bir tane soyut metodu olması gereklidir. Soyut sınıf içinde özellik ve metodlar tanımlayarak, bu sınıftan miras alarak alt sınıf oluşturacak yazılımcılara belirli kuralları belirlemiş oluyoruz. Temel özellikleri bunlar olsun, yazacağınız metodlar bunlar olsun şekilde. Yani soyut bir sınıf oluşturarak diğer yazılımcılar için ya da kendi yazacağımız diğer alt sınıflar için belirli bir temeli atmış oluyoruz. Bu nedenle alt sınıflar soyut metodun aynısını kendi sınıfları içinde de oluşturmak zorundadır.
Ayrıca unutmamanız gereken bir diğer detay da soyut sınıflardan asla nesne oluşturulamayacağıdır. Alt sınıflardan nesne oluştururuz.
Bağlantıda Kalalım