比較type和isinstance

2021-03-02 老齊教室

與本文相關圖書推薦:《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 loop

type比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 loop

isinstance和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的習慣帶過來。

關注微信公眾號:老齊教室

閱讀更多精彩文章

相關焦點

  • Python的isinstance在Golang裡面叫什麼?
    我們知道,在Python裡面,要判斷一個變量是不是某個類型,只需要使用isinstance這個關鍵詞:def
  • 深度剖析isinstance的檢查機制
    從源碼來看 isinstance 的檢測過程這部分的內容可能比較難,如果讀者覺得閱讀有難度可以跳過,直接看結論。繼續向下看源碼:/* We know what type's __instancecheck__ does.
  • C++typename的由來和用法
    我們經常會這麼用 typename,這是一項C++程式語言的泛型編程(或曰「模板編程」)的功能,typename關鍵字用於引入一個模板參數。其實還是一個嵌套從屬類型名稱(nested dependent type name)。嵌套從屬名稱是需要用聲明的,其他的名稱是不可以用聲明的。
  • 類型檢查:typeof 和 instanceof 運算符區別?
    使用typeof運算符以及instanceof來檢查實例類型。1.typeof運算符在 JS 中,基本類型有 String、Number、Boolean和 Symbol 等。此外,還有函數、對象和特殊值undefined和null。
  • Micro usb和type-C接口?手機市場趨於飽和的情況下,誰才是王者
    通常來講,手機充電接口有三種:一種是蘋果手機專用的正反扁口,還有安卓手機專屬的Micro usb和type-C接口,其實蘋果手機本質上也是屬於Micro usb的,但礙於它的製造工藝和主板規格,生產廠商將它的接口改成某種特殊的型號,那麼Micro usb和type-C接口,哪一個才是時代的王者呢,在選購手機時,哪一種接口才能優先考慮呢?
  • JavaScript學習- js中的typeof/instanceof
    typeof 是用的最多的一種,一般被用於來判斷一個變量的類型,可以使用 typeof 來判斷number、undefined、symbol、string、function、boolean、object 這七種數據類型。但是遺憾的是,typeof 在判斷 object 類型時候,有些許的尷尬。它並不能明確的告訴你,該 object 屬於哪一種 object。
  • 什麼是type c接口,為什麼現在很多新出的手機都換上type c了?
    Type-C是USB接口的一種連接介面,不分正反兩面均可插入,大小約為8.3mm×2.5mm,和其他介面一樣支持USB標準的充電、數據傳輸、顯示輸出等功能。Type-C接口屬於比較新的類型的接口,估計很快將會流行起來,像新版的MacBook,小米手機,都是這種接口的。
  • Python 之type 與object
    1、Python type 與objectpython 當中的type 是所有內置對象或者類的基類型,object 是所有類繼承的基類 因此int、str、list、tuple 等等這些內置的類這些都是type類的實例對象。因為type 也是類,因此type的基類也是object。
  • Content-Type作用是什麼?
    Content-Type 實體頭部用於指示資源的MIME類型 media type 。在響應中,Content-Type標頭告訴客戶端實際返回的內容的內容類型。Content-Type: text/html; charset=utf-8Content-Type: multipart/form-data; boundary=something指令:media-type
  • CSS3偽類選擇器 :nth-child() 和 :nth-of-type() 避坑
    div>    <div class="pic-item">4</div></div>.pic-item:nth-child(2n) {     background-color: #0099CC;}上面代碼的實際效果如下圖:看到上面這段代碼和效果圖
  • Mybatis之TypeHandler簡析
    typeHandlerTypeHandler處理資料庫類型和Java類型之間的轉換,先看下這個是怎麼使用的。第一種我們不用配置,框架會根據javaType自動獲取一個TypeHandler的實現類型第二種是自定義,並在resultmap中配置上,如:typeHandler="mytype"
  • 類型內置函數-type() isinstance()
    在介紹類型內置函數前,我們需要了解類對象和實例對象的概念。類對象是將具有相似屬性和方法的對象總結抽象為類對象,可以定義相似的一些屬性和方法。實例對象又稱實例化對象,不是抽象而是一類對象中具體的一例對象。比如:姓名、年齡是類對象,具體的某個人的姓名(張三)、年齡(21)就是實例對象。
  • 10萬元的F-type 吉利繽瑞F-type到店實拍
    有意思的是,這一次吉利還給這次的改款車型取了兩個不同的名字,「F-TYPE運動版」和「亞運版」,而我們以往熟知的F-TYPE來自顯然是來自英倫的一隻小豹子,那麼,這款「F-TYPE」能否對得起自己的名字呢,我們一起來看看吧。
  • Type-C接口:未來數據傳輸發展的趨勢
    關於Type-C接口,和我們最直接最大的關聯就是手機充電,對於現在的我們人來說,無論什麼情況下,手機一定要有電心裡才踏實,就怕手機沒電關機錯過了什麼,所以買手機除了要求大電池外就是要充電快,所以Type-C出現了!
  • 面試官:說說 typeof 與 instanceof 區別?
    一、typeoftypeof 操作符返回一個字符串,表示未經計算的操作數的類型使用方法如下:typeof operandtypeof(operand)operand表示對象或原始值的表達式,其類型將被返回舉個例子typeof 1 // 'number'typeof '1' // 'string'typeof undefined // 'undefined'typeof true // 'boolean