Duck Typing
Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 24 / 64.
Duck typing, bir nesnenin ne olduğuna değil, ne yapabildiğine odaklanır. Eğer bir nesne ihtiyacınız olan metotlara sahipse, sınıf türünden bağımsız olarak onu kullanabilirsiniz.
İşte aynı metotlara sahip, birbiriyle ilişkisi olmayan iki sınıf:
class Duck:
def swim(self):
return "Duck swimming"
def quack(self):
return "Quack!"
class Person:
def swim(self):
return "Person swimming"
def quack(self):
return "Person imitating a duck: Quack!"Duck ve Person'ın aynı üst sınıftan miras almadığına, ancak her ikisinin de swim() ve quack() metotlarına sahip olduğuna dikkat edin.
Herhangi bir "ördek benzeri" nesneyle çalışan bir fonksiyon oluşturun:
def make_it_swim_and_quack(duck_like_object):
print(duck_like_object.swim())
print(duck_like_object.quack())Bu fonksiyon nesnenin türüyle ilgilenmez - sadece nesnenin gerekli metotlara sahip olmasıyla ilgilenir.
Fonksiyonu her iki sınıf ile birlikte kullanın:
make_it_swim_and_quack(Duck())
make_it_swim_and_quack(Person())Çıktı:
Duck swimming
Quack!
Person swimming
Person imitating a duck: Quack!Başka bir "duck-like" sınıf ekleyin:
class Robot:
def swim(self):
return "Robot swimming with propellers"
def quack(self):
return "Robot sound: BEEP BEEP!"
make_it_swim_and_quack(Robot())Çıktı:
Robot swimming with propellers
Robot sound: BEEP BEEP!Anahtar Nokta: Duck typing, kalıtım olmadan polimorfizm sağlar. Eğer bir nesne ihtiyacınız olan metotlara sahipse, onu kullanabilirsiniz. Bu, Python kodunu esnek hale getirir ve "izin istemektense af dilemek daha kolaydır" ilkesini takip eder.
Görev
OrtaBu meydan okumada, farklı dosya benzeri nesnelerle duck typing (ördek tiplemesi) gösteren bir sistem uygulayacaksınız:
textfile.py:read()vewrite(data)metotlarına sahipTextFilesınıfını uygulayındatabase.py: Eşleşen metot imzalarına sahipDatabasesınıfını uygulayınnetworkresource.py: Eşleşen metot imzalarına sahipNetworkResourcesınıfını uygulayındriver.py- Uygulamanızın doğru çalıştığını doğrulayacak test senaryolarını uygulayın
Her dosya, uygulamanıza rehberlik edecek ayrıntılı TODO yorumları içerir.
Kopya kağıdı
Duck typing (ördek tipleme), bir nesnenin ne olduğuna değil, ne yapabildiğine odaklanır. Eğer bir nesne ihtiyacınız olan metotlara sahipse, sınıf türünden bağımsız olarak onu kullanabilirsiniz.
Aynı metotları paylaşan ilişkisiz sınıflarla duck typing örneği:
class Duck:
def swim(self):
return "Duck swimming"
def quack(self):
return "Quack!"
class Person:
def swim(self):
return "Person swimming"
def quack(self):
return "Person imitating a duck: Quack!"Herhangi bir "ördek benzeri" nesneyle çalışan bir fonksiyon oluşturun:
def make_it_swim_and_quack(duck_like_object):
print(duck_like_object.swim())
print(duck_like_object.quack())
# Works with any object that has swim() and quack() methods
make_it_swim_and_quack(Duck())
make_it_swim_and_quack(Person())Duck typing, kalıtım olmadan polimorfizme (çok biçimlilik) izin verir - eğer bir nesne ihtiyacınız olan metotlara sahipse, onu kullanabilirsiniz. Bu, Python kodunu esnek hale getirir ve "izin istemektense af dilemek daha kolaydır" prensibini takip eder.
Kendin dene
# TODO: textfile.py dosyasından TextFile sınıfını içe aktarın
# TODO: database.py dosyasından Database sınıfını içe aktarın
# TODO: networkresource.py dosyasından NetworkResource sınıfını içe aktarın
def process_data(data_source, data):
# TODO: data_source üzerinde read() metodunu çağırın ve sonucu yazdırın
# TODO: data_source üzerinde write(data) metodunu çağırın ve sonucu yazdırın
pass
# Farklı veri kaynakları ile test edin - BU TEST KODUNU DEĞİŞTİRMEYİN
text_file = TextFile()
database = Database()
network = NetworkResource()
print("Processing text file:")
process_data(text_file, "Hello, world!")
print("\
Processing database:")
process_data(database, "User record")
print("\
Processing network resource:")
process_data(network, "GET request")Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerYapıcı Metot (__init__)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımsuper() FonksiyonuMetot Geçersiz KılmaÇoklu KalıtımMetot Çözümleme SırasıÖzet - Çalışan Hiyerarşisi7Özel Metotlar
Sihirli Metotlara GirişOperatör Aşırı YüklemeKapsayıcı Sihirli MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım kalıplarına girişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı13Final Meydan Okumaları
E-öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi5Çok Biçimlilik (Polymorphism)
Metot Geçersiz Kılmaya Yeniden BakışDuck TypingSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımMixinsStatik ve Sınıf MetotlarıSınıf DekoratörleriBağlam Yöneticileri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı