Menu
Coddy logo textTech

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.

challenge icon

Görev

Orta

Bu meydan okumada, farklı dosya benzeri nesnelerle duck typing (ördek tiplemesi) gösteren bir sistem uygulayacaksınız:

  • textfile.py: read() ve write(data) metotlarına sahip TextFile sınıfını uygulayın
  • database.py: Eşleşen metot imzalarına sahip Database sınıfını uygulayın
  • networkresource.py: Eşleşen metot imzalarına sahip NetworkResource sınıfını uygulayın
  • driver.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.

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")
quiz iconKendini test et

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