簡體   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