與本文相關圖書推薦:《Python大學實用教程》
Python是一種動態語言,比如創建一個變量,一開始引用的是字符串,隨後就可以再引用整數或者浮點數,解釋器對這種變換也接受。這與類似Java那樣的語言就完全不同了。
name = "Sebastian"
# 下面演示的就是動態語言特點
name = 42
name = None
name = Exception() # 引用一個實例對象在程序中,檢查變量所引用的對象是什麼類型,對於Python程序也是必要的。一般我們會實用type()或者isinstance()這兩個內置函數。
>>> variable = "hello"
>>> type(variable) is str
True
>>> isinstance(variable, str)
True下面比較一下這兩個函數的性能:
$ python -m timeit -s "variable = 'hello'" "type(variable) is int"
2000000 loops, best of 5: 102 nsec per loop
$ python -m timeit -s "variable = 'hello'" "isinstance(variable, str)"
5000000 loops, best of 5: 72.8 nsec per looptype比instance慢了 40% (102/72.8 = 1.40).
有人也實用 type(variable) == str種方式判斷某個對象的類型,雖然此方法是可行的,但不提倡,因為:
• == should be used when you want to check the value of a variable. We would use it to see if the value ofvariable is equal to "hello". But when we want to check if variable is a string, is operator is more appropriate. For a more detailed explanation of when to use one or the other, check this article.• == is slower:
==應該用於檢查對象是否與另外一個對象相等。我們可以用它來查看變量的值是否等於hello,但是想要檢查變量是否是一個字符串時,不要用這個符號,而是改用is操作符更合適。$ python -m timeit -s "variable = 'hello'" "type(variable) == str"
2000000 loops, best of 5: 114 nsec per loopisinstance和type之間除了前面演示的執行速度不同之外,還有別的區別嗎?
有!而且下面要說的區別,比執行速度還重要。
type的返回值是一個對象的類型(類),可以用它來檢查variable的類型是否為str。isinstance要檢查第一個參數對象是不是第二個參數所指定的類的實例,例如variable是str類的一個實例嗎?或者,檢查是不是第二個參數所指定的類的子類的示例,例如variable是str子類的一個實例嗎?這在實踐很有用。假設自定義一個類,它類似於列表,但方法可以更多一些。所以我們可以把list作為這個類的父類,然後在這個類裡面寫其他的方法,基本樣式如下:
class MyAwesomeList(list):
# Add additional functions here但是現在,如果我們將這個新類與一個列表進行比較,type 和isinstance會返回不同的結果!
>>> my_list = MyAwesomeList()
>>> type(my_list) is list
False
>>> isinstance(my_list, list)
True輸出結果不同。
isinstance檢查my_list是否是list的一個實例(它不是)、或者是否是list的一個子類的實例(它是,因為MyAwesomeList是list的一個子類)。這個細節,有時候會導致BUG。
isinstance通常是判斷對象類型的首選方法。它不僅更快,而且還考慮了繼承,這通常是我們所需要的。不過,在Python中,我們通常不需要檢查某個對象的類型,只需要關注它能不能具備像字符串或列表那樣的方法和屬性,這就是著名的「鴨子檢驗」。因此,只需要使用isinstance即可。
另一方面,如果想顯式地檢查給定對象是否屬於某一特定類型(而不是它的子類),可以使用type,但通常用這樣的語句type(var) is some_type,而不是type(var) == some_type。
記住,編寫函數的時候,不檢查對象類型,是Python的慣例,不要把Java的習慣帶過來。
關注微信公眾號:老齊教室閱讀更多精彩文章