什么是动态调度和鸭子打字?

时间:2018-02-14 21:48:59

标签: python pycharm terminology term

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

  

未解决的参考'名称'。此检查检测应该的名称   解决但不要。 由于动态调度和鸭子打字,这是   可能在有限但有用的情况下。顶级和   支持类级别的项目比实例项目更好。

我已经窥探了这个问题,但我发现的大多数问题和信息都是为​​了防止信息显示出来。我想知道的是:

  • 什么是动态调度/鸭子打字?
  • 这些“有用案例数量”是什么(或其中的一个例子)?

2 个答案:

答案 0 :(得分:5)

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

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

在Python中,一切都会起作用,直到您尝试以不适合的方式操纵对象。基本上,一个对象可能没有另一个可能的某个方法或属性,并且在Python尝试它之前抛出错误之前你不会发现它。

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

class Foo:
   def flush():
       pass

class Bar:
    def flush():
       pass

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

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

答案 1 :(得分:1)

警告意味着您正在使用PyCharm无法识别的变量,但由于Python的动态特性,它无法确定它是否正确或者您是对的。

例如,您可能有以下代码:

class myClass():

    def myfunc(self):
        print(self.name)

PyCharm可能会抱怨self.name无法解决。但是,您可以使用以下类:

my_class = myClass()
my_class.name = "Alastair"
my_class.myfunc()

这是完全有效的(虽然很脆弱)。

这个消息继续说它对不那么模棱两可的属性和方法更有信心。例如:

class myClass():
    my_instance_var = "Al"

    def myfunc(self):
        print(self.my_instance_var)

由于my_instance_var在源代码(类属性)中定义,PyCharm可以确信它存在。

(除非你知道自己在做什么,否则不要使用类属性。)