什么是动态调度和鸭子输入?

Ric*_* M. 8 python terminology term pycharm

使用Pycharm时,它经常指出一个错误,说:

未解析的参考“名称”。此检查将检测应解析但不能解析的名称。由于动态调度和鸭子输入,这在有限但有用的情况下是可能的。与实例项相比,对顶级和类项的支持更好。

我已经对此进行了窥探,但是我发现的大多数问题和信息都与阻止消息显示有关。我想知道的是:

  • 什么是动态分派/鸭类输入?
  • 这些“有用案例数”是什么(或一个例子)?

sma*_*nts 6

Python使用鸭子输入约定。这意味着您不必指定名称的类型。例如,与Java不同,您必须明确指定变量可以是type intObject。本质上,类型检查是在运行时完成的。

“如果它走路像鸭子,却像鸭子一样嘎嘎叫,那它一定是鸭子。”

在Python中,一切似乎都可以正常工作,直到您尝试以一种非设计方式尝试操作对象为止。基本上,一个对象可能不具有另一个对象可能具有的特定方法或属性,并且在Python尝试尝试抛出错误之前,您不会发现这一点。

动态调度是编译器或环境选择在运行时使用哪个版本的多态函数的实践。如果一个方法有多个实现,则尽管方法具有相同或相似的属性/属性,也可以以不同的方式使用它们。这是一个例子:

class Foo:
   def flush():
       pass

class Bar:
    def flush():
       pass
Run Code Online (Sandbox Code Playgroud)

这两个类都有一个flush()方法,但是在运行时选择正确的名称。

Python不是此过程的最佳示例,因为方法可以采用多个参数,而不必重新实现。Java是一个更好的示例,但是我对它的流利程度不足以提供正确的示例。