什么是动态调度和duck类型?

2024-05-03 05:50:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Unresolved reference 'name'. This inspection detects names that should resolve but don't. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-level and class-level items are supported better than instance items.

我四处窥探过,但我发现的大多数问题和信息都是关于阻止信息显示的。我想知道的是:

  • 什么是动态调度/duck类型?
  • 这些“有用案例”是什么(或是一个例子)?

Tags: andname信息names错误itemsthislevel
2条回答

Python使用duck类型约定。这意味着您不必指定名称的类型。例如,与Java不同,在Java中必须显式指定变量的类型可以是intObject。实际上,类型检查是在运行时完成的。

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

在Python中,所有的东西似乎都可以工作,直到您尝试以一种非设计的方式操作对象。基本上,一个对象可能没有其他对象可能有的方法或属性,在Python尝试时抛出错误之前,您不会发现这一点。

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

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可以确信它存在。

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

相关问题 更多 >