Python’da Polimorfizm (Çok Biçimlilik)
Bu derste, Python’da çok biçimlilik (Polimorfizm) konseptinin ne olduğunu, nasıl kullanıldığını ve neden önemli olduklarını detaylarıyla inceleyeceğiz.
Python’da Polimorfizm
Polimorfizm, kelime anlamı olarak “çok biçimlilik” manasına gelir. Nesne yönelimli programlama penceresinden baktığımızda ise farklı sınıf türlerinin, aynı arayüzü ya da metodu kendi içinde farklı bir şekilde tanımlayabilmesi anlamına gelir. Başka bir deyişle, aynı metot adının farklı nesnelerde farklı işler yapabilme prensibidir.
Polimorfizmin belki de en büyük avantajlarından biri, daha genişletilebilir ve esnek kod yazmamıza olanak tanımasıdır. Bizlere, aynı isimli metotları farklı sınıflarda farklı şekillerde tanımlama yeteneği sunar. Örneğin:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Personel: def zam(self): zam_oran = 0.1 hesap = 100 + 100 * zam_oran print("Eleman: ", hesap, "TL") class Doktor: def zam(self): zam_oran = 0.2 hesap = 100 + 100 * zam_oran print("Doktor: ", hesap, "TL") class Hakim: def zam(self): zam_oran = 0.3 hesap = 100 + 100 * zam_oran print("Hakim: ", hesap, "TL") |
Yukarıdaki örnekte, Personel
, Doktor
ve Hakim
sınıflarının hepsi bağımsız olarak zam
adında bir metoda sahip. Ancak hiçbir sınıf bir diğerinden miras almıyor. Yani, her sınıfın zam
metodu tamamen bağımsız ve sınıfın kendi içerisinde tanımlanmış. Kodu çalıştırmak için: Trinket
Polimorfizm ve Miras Alma
Ebeveyn sınıftan çocuk sınıfa miras (inheritance) yoluyla aktarılan, ancak çocuk sınıfında farklı bir şekilde kullanılan metotların yaptığı iş polimorfizmdir. Böylece aynı metodu kullanıp farklı çıktılar alabiliriz.
Öncelikle örneğimizi, Personel
adında bir ana sınıfımız olacak şekilde yeniden tanımlayalım ve bu sınıf içerisine, personelin maaşına ne kadar zam yapılacağını belirten bir zam
metodu ekleyelim. Böylece metodun varsayılan davranışı, maaşa %10 zam yapmak olsun.
Daha sonra, Doktor
ve Hakim
adında iki alt sınıf oluşturalım. Bu iki sınıfı oluştururken, Personel
sınıfından miras alacağız. Yani, Doktor
ve Hakim
sınıfları, Personel
sınıfının tüm özelliklerini ve metodlarını devralacak. Ancak, doktor ve hakimler için zam oranlarının farklı olmasını istediğimiz için bu iki alt sınıf içerisinde zam
metodunu yeniden tanımlayarak ana sınıfın zam
metodunu “override” ediyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class Personel: def zam(self): zam_oran = 0.1 hesap = 100 + 100 * zam_oran print("Eleman: ", hesap, "TL") class Doktor(Personel): def zam(self): zam_oran = 0.2 hesap = 100 + 100 * zam_oran print("Doktor: ", hesap, "TL") class Hakim(Personel): def zam(self): zam_oran = 0.3 hesap = 100 + 100 * zam_oran print("Hakim: ", hesap, "TL") # Nesneleri oluşturuyoruz. personel = Personel() doktor = Doktor() hakim = Hakim() # Her bir nesnenin zam metodunu çağırıyoruz. personel.zam() doktor.zam() hakim.zam() |
Bu kodda, Doktor
ve Hakim
sınıflarının her biri zam
metodunu kendi ihtiyaçlarına göre yeniden tanımlayarak “override” ediyor. Bu sayede, her bir sınıf aynı isimli metodu farklı bir şekilde uyguluyor. İşte polimorfizm böyle bir şeydir. Kodu çalıştırmak için: Trinket
Bu yaklaşım, farklı sınıfların ortak bir arayüzü (yani aynı isimli metodu) paylaşmasına olanak tanırken, her sınıfın bu metodu kendi ihtiyaçlarına göre farklı bir şekilde uygulamasına da izin verir. Bu, kodun daha düzenli, esnek ve genişletilebilir olmasını sağlar.