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.

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")
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