當我們拿到一個對象的引用時,如何知道這個對象是什么類型、有哪些方法呢?
使用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類型。如果我們要在if語句中判斷,就需要比較兩個變量的type類型是否相同:
>>> type(123)==type(456)True>>> type('abc')==type('123')True>>> type('abc')==type(123)False
但是這種寫法太麻煩,Python把每種type類型都定義好了常量,放在types模塊里,使用之前,需要先導入:
>>> import types>>> type('abc')==types.StringTypeTrue>>> type(u'abc')==types.UnicodeTypeTrue>>> type([])==types.ListTypeTrue>>> type(str)==types.TypeTypeTrue
最后注意到有一種類型就叫TypeType,所有類型本身的類型就是TypeType,比如:
>>> type(int)==type(str)==types.TypeTypeTrue
使用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類型:
能用type()判斷的基本類型也可以用isinstance()判斷:
>>> isinstance('a', str)True>>> isinstance(u'a', unicode)True>>> isinstance('a', unicode)False
新聞熱點
疑難解答