En programmation, le typage canard est un style de typage dynamique. Dans ce style, la sémantique effective d'un objet est déterminée non pas par l'héritage d'une classe spécifique ou par l'implémentation d'une interface spécifique, mais par l'ensemble actuel de méthodes et de propriétés.
Le nom de ce concept vient du test du canard proposé par James Whitcomb Riley. Le "test du canard" peut s'exprimer ainsi :
"Quand vous voyez un oiseau marcher comme un canard et nageant comme un Si un canard cancane comme un canard, alors l'oiseau peut être appelé un canard "
Dans la frappe du canard, l'accent n'est pas mis sur le type de l'objet lui-même, mais sur la façon dont il est utilisé. Par exemple, dans un langage qui n'utilise pas le typage duck, nous pourrions écrire une fonction qui prend un objet de type duck et appelle ses méthodes walk et bark. Dans un langage qui utilise le typage duck, une telle fonction peut accepter un objet de n'importe quel type et appeler ses méthodes walk et call. Si les méthodes qui doivent être appelées n’existent pas, une erreur d’exécution sera générée. Le fait que tout objet avec les méthodes de marche et d'appel correctes puisse être accepté par une fonction conduit à l'instruction ci-dessus, d'où le nom de cette façon de déterminer les types.
Le typage Duck gagne souvent à ne pas tester les types de paramètres dans les méthodes et les fonctions, mais à s'appuyer plutôt sur la documentation, le code clair et les tests pour garantir une utilisation correcte. Les utilisateurs passant de langages à typage statique à des langages à typage dynamique tentent souvent d'ajouter une vérification de type statique (avant l'exécution), compromettant ainsi les avantages et l'évolutivité du typage canard et limitant la nature dynamique du langage.
Exemple de code Python
L'instruction ci-dessus est peut-être trop vide. Par exemple, en Python, il existe de nombreux éléments ressemblant à des fichiers, tels que StringIO, GzipFile et socket. Ils ont bon nombre des mêmes méthodes et nous les utilisons comme fichiers.
Par exemple, dans la méthode list.extend(), peu nous importe si son paramètre est une liste, tant qu'il est itérable, donc ses paramètres peuvent être list/tuple/dict/string/generator, etc. .
Le typage Duck est souvent utilisé dans les langages dynamiques et est très flexible, ce qui fait que Python n'a pas beaucoup de modèles de conception comme Java.
L'exemple suivant utilise le typage canard pour obtenir le polymorphisme.
#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)
Comme un autre exemple,
piratons le flux de sortie.
import sys sys.stdout = open('stdout.log', 'a') #只要是file-like,不管是什么类型 print 'foo' sys.stdout = sys.__stdout__ #恢复 print 'bar'
De cette façon, le flux de sortie est écrit dans le fichier.
Pour des explications plus détaillées sur la programmation du duck typing et les articles liés à l'implémentation de Python, veuillez faire attention au site Web PHP chinois !