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.