Çok biçimlilik çeşitli biçimler alabilme yeteneği olarak da ifade edilebilir. Bir nesne ya da metodun farklı yerlerde farklı kullanım şeklinde yer almasıdır. Örneğin + operatörü sayısal değerleri matematiksel olarak toplarken, metin değerleri birleştirme görevini yerine getirir. Öyleyse Python’da + operatörü çok biçimli bir nesnedir.

Şimdi, Python’da nesne tabanlı programlama ile çalışırken çok biçimlilikten nasıl faydalanabileceğimiz ile ilgili detaylı ama basit seviyede bir örnekle durumu açıklayalım.

Örnek olarak bir fabrika çalışanları için personel sınıfı oluşturalım. Fabrikada 4 kategoride personel bulunsun; İşçi,Ustabaşı,Mühendis,Üretim Müdürü.
Temel ücret olarak asgari ücret baz alınsın. Ayrıca fabrikada çalışma süresine bağlı bir kıdem katsayısı ile aynı görevdeki kişilerden daha eski çalışanlar yenilere göre daha fazla maaş alsın. Ancak bu katsayı da belirli bir tavan limitini geçmemelidir ki unvana göre alınabilecek maaş dengesi bozulmasın. Yani 20 yıllık bir ustabaşı 2 yıllık bir üretim müdüründen daha fazla maaş almayacaktır.
Bu durum ile iligli oluşturabileceğimiz temel sınıf ve miras alan sınıflar şu şekilde olabilir;
class Personel:
  def __init__(kisi,ad,soyad, gorev, calismaSuresi):
    kisi.ad=ad
    kisi.soyad=soyad
    kisi.gorev=gorev
    kisi.calismaSuresi=calismaSuresi

  def maas(kisi):
    pass

  def veriyazdir(kisi):
    pass

class Calisan(Personel):
  pass

class Yonetici(Personel):
  pass

 

Gördüğünüz gibi ana sınıfımızdan her bir personel için adı-soyadı, görevi ve çalışma süresi ile ilgili bilgi üretebiliriz. Alt sınıflarımız ise belirli unvanlara göre personele farklı bir işlev kazandırabilecek şekilde kullanılabilir. Veri yapımızı böylece oluşturmuş olduk.

Şimdi de, uygulamamıza gerekli işlevselliği kazandıracak fonksiyonlarımızı yazalım.

class Personel:
  def __init__(kisi,ad,soyad, gorev, calismaSuresi):
    kisi.ad=ad
    kisi.soyad=soyad
    kisi.gorev=gorev
    kisi.calismaSuresi=calismaSuresi

  def maasHesapla(kisi):
    asgariUcret=2324
    kidemKatsayisi=kisi.calismaSuresi*0.01
    maas=asgariUcret+(asgariUcret*kidemKatsayisi)
    return maas
  
  def veriYazdir(kisi):
    print("Personelin Adı-Soyadı: ", kisi.ad, kisi.soyad)
    print("Görevi: ", kisi.gorev)
    print("Kurumda Çalışma Süresi: ", kisi.calismaSuresi)
    print("Aldığı Ücret: ")

class Calisan(Personel):
  pass

class Yonetici(Personel):
  def maasHesapla(kisi):
    asgariUcret=2324
    kidemKatsayisi=kisi.calismaSuresi*0.01
    if kisi.gorev == "Mühendis":
      unvanKatsayisi=0.25
    elif kisi.gorev == "Üretim Müdürü":
      unvanKatsayisi=1.25
    maas=(3*asgariUcret)+(asgariUcret*kidemKatsayisi)+(asgariUcret*unvanKatsayisi)
    return maas


personel1=Calisan("Ahmet","Yılmaz","İşçi",4)
personel2=Calisan("Veli","Kocaman","İşçi",9)
personel3=Calisan("Hasan","Karadağ","Ustabaşı",13)
personel4=Yonetici("Tamer","Doğrusöz","Mühendis",8)
personel5=Yonetici("Serdar","Deveci","Üretim Müdürü",5)

personel1.veriYazdir()
print(personel1.maasHesapla())
print()
print()
personel2.veriYazdir()
print(personel2.maasHesapla())
print()
print()
personel3.veriYazdir()
print(personel3.maasHesapla())
print()
print()
personel4.veriYazdir()
print(personel4.maasHesapla())
print()
print()
personel5.veriYazdir()
print(personel5.maasHesapla())

Çıktı:

Personelin Adı-Soyadı: Ahmet Yılmaz
Görevi: İşçi
Kurumda Çalışma Süresi: 4
Aldığı Ücret: 
2416.96


Personelin Adı-Soyadı: Veli Kocaman
Görevi: İşçi
Kurumda Çalışma Süresi: 9
Aldığı Ücret: 
2533.16


Personelin Adı-Soyadı: Hasan Karadağ
Görevi: Ustabaşı
Kurumda Çalışma Süresi: 13
Aldığı Ücret: 
2626.12


Personelin Adı-Soyadı: Tamer Doğrusöz
Görevi: Mühendis
Kurumda Çalışma Süresi: 8
Aldığı Ücret: 
7738.92


Personelin Adı-Soyadı: Serdar Deveci
Görevi: Üretim Müdürü
Kurumda Çalışma Süresi: 5
Aldığı Ücret: 
9993.2

 

Gördüğünüz gibi ana sınıfımızın içinde bir maaş hesaplama metodumuz mevcut ve bu sayede çalışanların maaşlarını hesaplayabiliyoruz. Ancak, mühendis ve yönetici ünvanlarına sahip olan personelin maaşında bir takım unvan ile ilgili değişik hesaplamalar söz konusu. Bu nedenle ana sınıftan miras alma yoluyla türetilen yöneticiler sınıfında maasHesapla() metodunu tekrar kodluyoruz. Sonuç olarak uygulamayı çalıştırdığımızda her personel için maasHesapla() metodunu kullanıyoruz ancak metod ana sınıf için farklı diğer sınıf için farklı hesaplamalar yapıyor. İşte buna Çok Biçimlilik(Polymorphism) diyoruz.
Bu konu ile ilgili örnek kodlara şurada göz atabilir ve çalıştırabilirsiniz;