ProgramlamaPython geliştirici

Python'da polimorfizm nasıl uygulanır, hangi türleri vardır ve dinamik türlemenin pratikteki incelikleri nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.

Sorunun geçmişi

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.

Problem

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.

Çözüm

Python'da şu türler ayırt edilir:

  • Normal (klasik) polimorfizm miras alma ve yöntemlerin yeniden tanımlanması yoluyla:
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!
  • Ganguru Yazımı — Eğer bir sınıfın gereken bir yöntemi varsa, bu yöntem bekleyen herhangi bir işlev için uygundur, hangi kalıttan olduğu önemli değildir:
class Duck: def quack(self): return 'Quack!' def make_quack(animal): print(animal.quack()) make_quack(Duck()) # Quack!
  • Arayüz taklidi — abc.ABC ve @abstractmethod ile, sınıfların belirli yöntemleri uygulaması gerektiğini formüle edebilirsiniz.

Anahtar özellikler:

  • Sert bir miras hiyerarşesine sahip olma zorunluluğunun olmaması.
  • Gereken arayüzü destekleyen nesnelerin çalışma zamanı sırasında yer değiştirilmesi olanağı.
  • Arayüzlerin uyumsuzluk hataları yalnızca çalışma sırasında ortaya çıkar.

Kandırmaca Soruları.

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.

Tipik hatalar ve anti-paterna

  • Yöntemin semantiğine uymadan arayüzün yanlış uygulanması.
  • Yeterli testler olmadan ganguru yazımına güvenmek, bu da çalışma zamanı hatalarına neden olur.
  • Python'un garanti etmediği sıkı türlemeyi beklemek.

Gerçek hayattan bir örnek

Olumsuz durum

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:

  • Farklı sınıfların gereksiz bürokrasi olmadan hızlı entegrasyonu.

Eksiler:

  • Genellikle yalnızca çalışma zamanında, çoğu zaman üretimde bulunan sessiz hatalar.

Olumlu durum

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:

  • Açıklık, en sık yapılan hataların önlenmesi.
  • Kodun güvenilirliğinin artırılması.

Eksiler:

  • Daha sıkı bir geliştirme disiplini, daha fazla kod ve belgeler gerektirir.