[英]What is dynamic dispatch and duck typing?
使用Pycharm時,它經常指出錯誤,說:
未解決的參考'名稱'。 此檢查檢測應解決但不能解析的名稱。 由於動態調度和鴨子打字 ,這在有限但有用的情況下是可能的。 頂級和類級別項比實例項更受支持。
我已經窺探了這個問題,但我發現的大多數問題和信息都是為了防止信息顯示出來。 我想知道的是:
Python使用鴨子類型約定。 這意味着您不必指定名稱的類型。 例如,與Java不同,您必須明確指定該變量可以是int
或Object
類型。 實質上,類型檢查是在運行時完成的。
“如果它像鴨子一樣走路,它像鴨子一樣嘎嘎叫,那它一定是鴨子。”
在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.