Polimorfizm — nesne yönelimli programlamanın temel ilkelerinden biridir ve farklı yapıya sahip nesnelerin aynı arayüzü uygulamasını, dolayısıyla birbirleriyle değiştirilebilir olmasını sağlar. Python'da dinamik türleme ile polimorfizm oldukça esnektir.
Sert statik türleme (Java, C++) dillerinde polimorfizmin desteklenmesi, arayüzlerin veya soyut sınıfların tanımlanmasını gerektirir. Python'da — ganguru yazımında — polimorfizm miras hiyerarşisine ve hatta arayüze bağlı değildir. Önemli olan, nesnenin gereken yöntemleri/nitelikleri desteklemesidir.
Bir yandan, bu dilin esnek ve kullanışlı olmasını sağlar. Öte yandan — yazım hataları veya gereken yöntemlerin eksik olması durumunda çalışma zamanında hataların olasılığını artırır; bu hatalar yalnızca kod çalıştırıldığında ortaya çıkar.
Python'da şu türler ayırt edilir:
class Animal: def speak(self): raise NotImplementedError class Dog(Animal): def speak(self): return 'Woof!' class Cat(Animal): def speak(self): return 'Meow!' def animal_voice(animal): print(animal.speak()) animal_voice(Dog()) # Woof! animal_voice(Cat()) # Meow!
class Duck: def quack(self): return 'Quack!' def make_quack(animal): print(animal.quack()) make_quack(Duck()) # Quack!
Anahtar özellikler:
Python'da polimorfizmi sağlamanın tek yolu miras alma mıdır?
Hayır. Ganguru yazım sayesinde, herhangi bir işlev gerekli yöntemlere sahip bir nesneyi, sınıfı veya hiyerarşisi bağımsız olarak kabul edebilir.
Sadece yöntem adının ismine göre bir imza ile uyum sağlamak polimorfizm olarak kabul edilebilir mi?
Hayır. Eğer nesne gerekli yöntemi destekliyorsa ancak anlamı beklenenden farklıysa, hatalar olabilir. Polimorfizm yalnızca arayüzün değil, anlamın da eşleşmesi durumunda başarılıdır.
Soyut sınıf, alt sınıflardaki yanlış uygulanan arayüz hatalarına karşı korunma sağlar mı?
Sadece kısmen. Eğer miras alan sınıf soyut yöntemi uygulamazsa, bir örnek oluşturmaya çalışırken TypeError meydana gelecektir. Ancak, mantığı ihlal eden bir uygulama olursa hatalar meydana gelebilir.
Bir günlük kütüphanesine, log() adlı bir yöntem içeren bir dış sınıf entegre ediliyor, ancak bu yöntem günlük kaydı yerine veri nesnesi döndürüyor. Hatalar yalnızca kullanım sırasında ortaya çıkıyor.
Artılar:
Eksiler:
Sınıflar testler ile donatıldı, arayüz soyut bir temel sınıf ve @abstractmethod ile biçimlendirildi, belgelerde yöntemlerin semantiği yazıldı.
Artılar:
Eksiler: