Type()和isinstance()有什么區(qū)別茂腥?

文章來源: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比檢查types的身份更糟糕薇正,因為它無縫地支持繼承。

這并不是說isinstance好的囚衔,請注意—它只是比檢查類型的相等性更少壞挖腰。 正常的,Pythonic的练湿,首選的解決方案幾乎總是"鴨子類型":嘗試使用參數(shù)猴仑,好像它是某種期望的類型,在try/except語句中執(zhí)行此操作鞠鲜,捕獲如果參數(shù)實際上不是該類型(或任何其他類型很好地鴨子模仿它;-)可能出現(xiàn)的所有異常宁脊,并且在except子句中断国,嘗試其他操作(使用參數(shù)"好像"它是某種其他類型)贤姆。

basestring榆苞,但是,相當(dāng)特殊的情況—存在的內(nèi)建類型霞捡,允許您使用isinstancestrunicode子類basestring)坐漏。 字符串是序列(你可以循環(huán)它們,索引它們碧信,切片它們赊琳,。..)砰碴,但您通常希望將它們視為"標(biāo)量"類型-它有點不創(chuàng)新(但相當(dāng)頻繁的用例)來處理各種字符串(也許還有其他標(biāo)量類型躏筏,即您無法循環(huán)的類型),所有容器(列表呈枉,集趁尼,..)換句話說,加上basestringisinstance可以幫助你做到這一點-這個成語的整體結(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版本中亮元,檢查類型相等比以前更糟糕猛计。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爆捞,隨后出現(xiàn)的幾起案子奉瘤,更是在濱河造成了極大的恐慌,老刑警劉巖煮甥,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盗温,死亡現(xiàn)場離奇詭異,居然都是意外死亡苛秕,警方通過查閱死者的電腦和手機肌访,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艇劫,“玉大人吼驶,你說我怎么就攤上這事〉晟罚” “怎么了蟹演?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長顷蟀。 經(jīng)常有香客問我酒请,道長,這世上最難降的妖魔是什么鸣个? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任羞反,我火速辦了婚禮,結(jié)果婚禮上囤萤,老公的妹妹穿的比我還像新娘昼窗。我一直安慰自己,他們只是感情好涛舍,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布澄惊。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掸驱。 梳的紋絲不亂的頭發(fā)上肛搬,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音毕贼,去河邊找鬼温赔。 笑死,一個胖子當(dāng)著我的面吹牛帅刀,可吹牛的內(nèi)容都是我干的让腹。 我是一名探鬼主播远剩,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扣溺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓜晤?” 一聲冷哼從身側(cè)響起锥余,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痢掠,沒想到半個月后驱犹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡足画,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年雄驹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淹辞。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡医舆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出象缀,到底是詐尸還是另有隱情蔬将,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布央星,位于F島的核電站霞怀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏莉给。R本人自食惡果不足惜毙石,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颓遏。 院中可真熱鬧徐矩,春花似錦、人聲如沸州泊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至力喷,卻和暖如春刽漂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弟孟。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工贝咙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拂募。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓庭猩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陈症。 傳聞我的和親對象是個殘疾皇子蔼水,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容