别当庸医;我支持你:
"Duck typing" := "尝试方法,不检查类型"
注意::=可以读作“被定义为”。
“Duck typing”的意思是:只要在任何进入的对象上尝试方法(函数调用),而不是先检查对象的类型,看看该方法是否是一个有效的调用这样的类型。
我们称之为“尝试方法,不检查类型”打字,“方法调用类型检查”,或者只是“方法-call typing” 简称。
在下面更长的解释中,我将更详细地解释这一点,并帮助您理解“鸭子打字”这个荒谬、深奥和混淆的术语。
更长的解释:
死了?死了! ?
Python 在上面做了这个概念。考虑这个示例函数:
def func(a):
a.method1()
a.method2()
当对象(输入参数a)进入函数func()时,函数将尝试(在运行时)调用该对象上指定的任何方法(即:method1()和method2()在上面的示例),而不是首先检查 a 是否是具有这些方法的某个“有效类型”。
因此,它是在运行时的基于动作的尝试,而不是在编译时或运行时的基于类型的检查。
现在看看这个愚蠢的例子:
def func(duck_or_duck_like_object):
duck_or_duck_like_object.quack()
duck_or_duck_like_object.walk()
duck_or_duck_like_object.fly()
duck_or_duck_like_object.swim()
因此诞生了这个荒谬的短语:
如果它走路像鸭子,叫起来像鸭子,那么它就是鸭子。
使用“duck typing”的程序应该简单地尝试在对象上调用的任何方法(在上面的示例中:quack()、walk()、fly() 和 swim())甚至不知道 对象的类型!它只是尝试方法!如果它们有效,那太好了,因为所有“鸭子打字”语言都知道或关心,IT(传递给函数的对象)是一只鸭子!——因为所有(鸭子样)方法都在它上面工作。
(总结我自己的话):
“鸭子类型”语言不应检查其类型(无论是在编译时还是运行时)——它不关心。它只会在运行时尝试这些方法。如果他们工作,那就太好了。如果他们不这样做,那么它将引发运行时错误。
这是鸭式打字。
我厌倦了这种荒谬的“鸭子”解释(因为没有这个完整的解释,它根本没有任何意义!),其他人听起来也是如此。示例:来自BKSpurgeon's answer here(我的重点是粗体):
(“如果它走路像鸭子,叫起来像鸭子,那它就是鸭子。”) - 是的!但这是什么意思??!”
现在我明白了:只要对进来的任何对象尝试该方法,而不是先检查对象的类型。
我称之为“运行时检查程序只是尝试调用的方法,甚至不知道对象是否有这些方法,而不是首先检查对象的类型知道对象的方法有这些方法”,因为这样更有意义。但是……说起来太长了,所以人们宁愿多年来互相混淆,而不是说一些荒谬但朗朗上口的话,比如“鸭子打字”。
让我们改为:“尝试方法,不检查类型” 打字。或者,也许:“方法调用类型检查”(简称“方法调用类型”),或“方法调用的间接类型检查” ,因为它使用给定方法的调用作为“足够证明”对象的类型是正确的,而不是直接检查对象的类型。
请注意,这种“方法调用类型检查”(或者容易混淆地称为“鸭子类型”)是一种动态类型。但是,并不是所有的动态类型都必须是“方法调用类型检查”,因为动态类型,或者说运行时的类型检查,也可以由来完成实际检查对象的类型,而不是简单地尝试在函数中调用对象所调用的方法而不知道其类型。
另请阅读:
-
https://en.wikipedia.org/wiki/Duck_typing --> 在页面中搜索“run”、“run time”和“runtime”。