繁体   English   中英

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

[英]What is dynamic dispatch and duck typing?

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

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

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

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

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

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

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

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

class Foo:
   def flush():
       pass

class Bar:
    def flush():
       pass

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

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

警告意味着您正在使用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可以确信它存在。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM