Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung der Duck-Typing-Duck-Type-Programmierung und der Python-Implementierung

Ausführliche Erläuterung der Duck-Typing-Duck-Type-Programmierung und der Python-Implementierung

高洛峰
高洛峰Original
2017-03-03 15:38:552665Durchsuche

In der Programmierung ist Duck Typing ein Stil des dynamischen Tippens. Bei diesem Stil wird die effektive Semantik eines Objekts nicht durch das Erben von einer bestimmten Klasse oder die Implementierung einer bestimmten Schnittstelle bestimmt, sondern durch den aktuellen Satz von Methoden und Eigenschaften.

Der Name dieses Konzepts stammt von dem von James Whitcomb Riley vorgeschlagenen „Ententest“ kann folgendermaßen ausgedrückt werden:
„Wenn Sie einen Vogel sehen, der wie eine Ente läuft und Schwimmen wie eine Ente Quacksalber wie eine Ente, dann kann der Vogel eine Ente genannt werden. Beispielsweise könnten wir in einer Sprache, die kein Duck-Typing verwendet, eine Funktion schreiben, die ein Objekt vom Typ duck nimmt und dessen Walk- und Bark-Methoden aufruft. In einer Sprache, die Duck-Typing verwendet, kann eine solche Funktion ein Objekt jeden Typs akzeptieren und seine Walk- und Call-Methoden aufrufen. Wenn die aufzurufenden Methoden nicht vorhanden sind, wird ein Laufzeitfehler ausgelöst. Die Tatsache, dass jedes Objekt mit den richtigen Walk- und Call-Methoden von einer Funktion akzeptiert werden kann, führt zu der obigen Aussage, daher der Name dieser Art der Typenbestimmung.
Duck Typing profitiert oft davon, die Parametertypen in Methoden und Funktionen nicht zu testen, sondern sich stattdessen auf Dokumentation, klaren Code und Tests zu verlassen, um die korrekte Verwendung sicherzustellen. Benutzer, die von statisch typisierten Sprachen zu dynamisch typisierten Sprachen wechseln, versuchen häufig, eine statische Typprüfung (vor der Laufzeit) hinzuzufügen, wodurch die Vorteile und die Skalierbarkeit des Duck-Typings beeinträchtigt und die dynamische Natur der Sprache eingeschränkt werden.

Python-Codebeispiel
Die obige Anweisung ist möglicherweise zu leer. In Python gibt es beispielsweise viele dateiähnliche Dinge wie StringIO, GzipFile und Socket. Sie haben viele der gleichen Methoden und wir verwenden sie als Dateien.
Zum Beispiel ist es uns in der Methode list.extend() egal, ob der Parameter eine Liste ist, solange er iterierbar ist, sodass seine Parameter Liste/Tupel/Dikt/String/Generator usw. sein können .
Duck-Typing wird häufig in dynamischen Sprachen verwendet und ist sehr flexibel, was dazu führt, dass Python nicht wie Java mit vielen Designmustern umgehen muss.

Das folgende Beispiel verwendet Duck-Typing, um Polymorphismus zu erreichen.

#coding=utf-8 
class Duck: 
  def quack(self): 
    print "Quaaaaaack!" 
 
class Bird: 
  def quack(self): 
    print "bird imitate duck." 
 
class Doge: 
  def quack(self): 
    print "doge imitate duck." 
 
def in_the_forest(duck): 
  duck.quack() 
 
duck = Duck() 
bird = Bird() 
doge = Doge() 
for x in [duck, bird, doge]: 
  in_the_forest(x)

Als weiteres Beispiel

hacken wir den Ausgabestream.

import sys 
 
sys.stdout = open('stdout.log', 'a') #只要是file-like,不管是什么类型 
print 'foo' 
 
sys.stdout = sys.__stdout__ #恢复 
print 'bar'

Auf diese Weise wird der Ausgabestream in die Datei geschrieben.

Ausführlichere Erläuterungen zur Duck-Typing-Programmierung und Artikel zur Python-Implementierung finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn