文章來源:Type()和isinstance()有什么區(qū)別? - 代碼領(lǐng)悟code05.com
提問:Python中Type()和isinstance()有什么區(qū)別切省?
這兩個代碼段有什么區(qū)別最岗?
使用type()
:
import types
if type(a) is types.DictType:
do_something()
if type(b) in types.StringTypes:
do_something_else()
使用isinstance()
:
if isinstance(a, dict):
do_something()
if isinstance(b, str) or isinstance(b, unicode):
do_something_else()
回答:
總結(jié)其他的內(nèi)容(已經(jīng)很好了!)答案朝捆,isinstance
迎合繼承(派生類的實例也是基類的實例)般渡,而檢查type
的相等性則沒有(它要求類型的標(biāo)識并拒絕子類型的實例,又名子類)芙盘。
通常驯用,在Python中,您希望您的代碼支持繼承儒老,當(dāng)然(由于繼承非常方便蝴乔,因此阻止使用您的代碼使用它會很糟糕!)驮樊,所以isinstance
比檢查type
s的身份更糟糕薇正,因為它無縫地支持繼承。
這并不是說isinstance
是好的囚衔,請注意—它只是比檢查類型的相等性更少壞挖腰。 正常的,Pythonic的练湿,首選的解決方案幾乎總是"鴨子類型":嘗試使用參數(shù)猴仑,好像它是某種期望的類型,在try
/except
語句中執(zhí)行此操作鞠鲜,捕獲如果參數(shù)實際上不是該類型(或任何其他類型很好地鴨子模仿它;-)可能出現(xiàn)的所有異常宁脊,并且在except
子句中断国,嘗試其他操作(使用參數(shù)"好像"它是某種其他類型)贤姆。
basestring
是榆苞,但是,相當(dāng)特殊的情況—存在僅的內(nèi)建類型霞捡,允許您使用isinstance
(str
和unicode
子類basestring
)坐漏。 字符串是序列(你可以循環(huán)它們,索引它們碧信,切片它們赊琳,。..)砰碴,但您通常希望將它們視為"標(biāo)量"類型-它有點不創(chuàng)新(但相當(dāng)頻繁的用例)來處理各種字符串(也許還有其他標(biāo)量類型躏筏,即您無法循環(huán)的類型),所有容器(列表呈枉,集趁尼,..)換句話說,加上basestring
和isinstance
可以幫助你做到這一點-這個成語的整體結(jié)構(gòu)是這樣的:
if isinstance(x, basestring)
return treatasscalar(x)
try:
return treatasiter(iter(x))
except TypeError:
return treatasscalar(x)
你可以說basestring
是一個抽象基類("ABC")—它不提供子類的具體功能猖辫,而是作為一個"標(biāo)記"存在酥泞,主要用于isinstance
。 這個概念在Python中顯然是一個不斷增長的概念啃憎,因為PEP3119引入了它的泛化芝囤,被接受并從Python2.6和3.0開始實施。
PEP清楚地表明辛萍,雖然Abc通趁蹑ⅲ可以代替鴨子打字,但通常沒有很大的壓力(見here)贩毕。 然而挠轴,在最近的Python版本中實現(xiàn)的abc確實提供了額外的好處:isinstance
(和issubclass
)現(xiàn)在不僅僅意味著"[一個]派生類的實例"(特別是,任何類都可以用ABC"注冊"耳幢,以便它將顯示為子類岸晦,其實例作為ABC的實例);并且Abc還可以通過模板方法設(shè)計模式應(yīng)用程序以非常自然的方式為實際子類提供額外的便利(參見here和這里[[第二部分]]有關(guān)tm dp的更多信息,一般情況下睛藻,特別是在python中启上,獨立于abcs)。
有關(guān)Python2.6中提供的ABC支持的底層機制店印,請參閱here;對于他們的3.1版本冈在,非常相似,請參閱here按摘。 在這兩個版本中包券,標(biāo)準(zhǔn)庫模塊集合(這是3.1版本—對于非常相似的2.6版本纫谅,請參閱here)提供了幾個有用的Abc。
為了這個答案的目的溅固,保留關(guān)于Abc的關(guān)鍵事情(除了可以說更自然的放置TM DP功能付秕,與UserDict等mixin類的經(jīng)典Python替代方案相比。DictMixin)是他們使isinstance
(和issubclass
)比以前(在2.5及之前)更具吸引力和普及性(在Python2.6中)侍郭,因此询吴,相比之下,在最近的Python版本中亮元,檢查類型相等比以前更糟糕猛计。