在Python中有兩種類型判斷函數,type()和isinstance()。
使用type()
#首先,我們來判斷物件類型,使用type()函數:
#基本型別都可以用type()判斷:
>>> type(123) <type 'int'> >>> type('str') <type 'str'> >>> type(None) <type 'NoneType'>
如果一個變數指向函數或類,也可以用type()判斷:
>>> type(abs) <type 'builtin_function_or_method'> >>> type(a) <class '__main__.Animal'>
但是type()函數傳回的是什麼類型呢?它傳回type類型。
使用isinstance()
對class的繼承關係來說,使用type()就很不方便。我們要判斷class的類型,可以使用isinstance()函數。
我們回顧上次的例子,如果繼承關係是:
object -> Animal -> Dog -> Husky
那麼,isinstance()就可以告訴我們,一個物件是否是某種類型。先建立3種類型的物件:
>>> a = Animal() >>> d = Dog() >>> h = Husky()
然後,判斷:
>>> isinstance(h, Husky) True
沒有問題,因為h變數指向的就是Husky物件。
再判斷:
>>> isinstance(h, Dog) True
h雖然本身是Husky類型,但由於Husky是從Dog繼承下來的,所以,h也還是Dog類型。換句話說,isinstance()判斷的是一個物件是否是該類型本身,或位於該類型的父繼承鏈上。
因此,我們可以確信,h還是Animal類型:
>>> isinstance(h, Animal) True
同理,實際類型是Dog的d也是Animal類型:
>>> isinstance(d, Dog) and isinstance(d, Animal) True
但是,d不是Husky類型:
>>> isinstance(d, Husky) False
能用type()判斷的基本型別也可以用isinstance()判斷:
>>> isinstance('a', str) True >>> isinstance(u'a', unicode) True >>> isinstance('a', unicode) False
並且還可以判斷一個變數是否是某些型別中的一種,例如下面的程式碼就可以判斷是否是str或unicode:
>>> isinstance('a', (str, unicode)) True >>> isinstance(u'a', (str, unicode)) True
由於str和unicode都是從basestring繼承下來的,所以,還可以把上面的程式碼簡化為:
>>> isinstance(u'a', basestring) True
#既然有了type()來判斷類型,為什麼還有isinstance()呢?一個明顯的差異是在判斷子類別。 type()不會認為子類別是一種父類別類型。 isinstance()會認為子類別是一種父類別類型。
以上是怎麼查看一個物件的類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!