摘要:即使需要檢查類型,也應該用來判斷,這樣你期望類型的也能正常被處理比如,一個函數需要處理類型,那么它應該也能處理的子類型,所以應該使用這樣來判斷而不是來判斷。結論盡量不要使用方法,多使用,這樣可以減少錯誤。
注意:本文代碼測試均在python2.75環境
python判斷變量數據類型目前有兩種方法:
第一種方法使用type()方法:
In [22]: type(111)==int Out[22]: False In [25]: import types In [26]: type(111)==types.IntType Out[26]: True
第二種方法使用isinstance()方法:
In [27]: isinstance(111,int) Out[27]: True
不使用type()代碼示例:
代碼示例:
class A(object): pass class B(A): pass print type(A()) == A # True print type(B()) == A # False print isinstance(A(),A) # True print isinstance(B(),A) # True
特殊代碼示例:
from collections import Iterator class A(object): def __iter__(self): pass def next(self): pass isinstance(A(), Iterator) # True type(A()) == Iterator # False
一個明顯的區別是在判斷子類。這個主要是由于python新式類和舊式類區別造成,相關鏈接:http://www.python.org/doc/new...
type()不會認為子類是一種父類類型。
isinstance()會認為子類是一種父類類型
正常情況下不應該編寫代碼檢查類型的,而應該直接假設被操作的instance具有你希望的屬性,否則拋出異常。即使需要檢查類型,也應該用isinstance來判斷,這樣你期望類型的subclass也能正常被處理(比如,一個函數需要處理Message類型,那么它應該也能處理Message的子類型MyMessage,所以應該使用isinstance(arg,Message)這樣來判斷而不是type(arg) == Message來判斷)。
參考Duck Typing http://en.wikipedia.org/wiki/...
代碼示例額2:
import typesclass UserInt(int): def __init__(self, val=0): self.val = int(val) i = 1n = UserInt(2) print(type(i) is type(n)) # False
這就說明i和n的類型是不一樣的,而實際上UserInt是繼承自int的,所以這個判斷是存在問題的,當我們對Python內建類型進行擴展的時候,type返回的結果就不夠準確了。這就說明i和n的類型是不一樣的,而實際上UserInt是繼承自int的,所以這個判斷是存在問題的,當我們對Python內建類型進行擴展的時候,type返回的結果就不夠準確了。
代碼示例3:
class A(): pass class B(): pass a = A() b = B() print(type(a) is type(b)) # True
type比較的結果a和b的類型是一樣的,結果明顯是不準確的。這種古典類的實例,type返回的結果都是一樣的,而這樣的結果不是我們想要的。對于內建的基本類型來說,使用tpye來檢查是沒有問題的,可是當應用到其他場合的時候,type就顯得不可靠了。
結論:
盡量不要使用type()方法,多使用isinstance(),這樣可以減少錯誤。
參考:
http://www.chenxm.cc/post/429...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/40943.html
摘要:入門細節相除后的類型雙斜杠是整除,出來的類型是。序列,集合和字典屬于組,是的基本數據類型。變量名區分大小寫。盡量避免循環引入。變量函數等引入內指定的變量函數等。中如果沒有出現模塊名也是絕對導入。頂級包與入口文件的位置 python入門細節 相除后的類型 type(2/2) float type(2//2) int 雙斜杠是整除,出來的類型是int。單斜杠的出來的是float類型。 進制...
摘要:語言也被稱作為膠水語言,可以混合其他如,等來編程可以把其他語言制作的各種模塊尤其是很輕松的聯結在一起。會認為子類是一種父類類型。 最近學習了python3的語法,整理記錄一下;語法是編程的先決條件,精通語法是編好程序的必要條件; 導語 給我最大的感覺是:這個語言的編寫,居然不使用 { }來控制代碼塊的區域,而是使用縮進來分割代碼塊,所以使用python語言編寫的代碼不能壓縮混淆。能夠...
摘要:列表越界的列表類似于動態數組,沒有長度的限制。比如對將要傳進內層函數的參數進行檢測等,從而實現對參數的類型進行限制。對二維列表的每一維列表進行長度限制,不足指定長度,自動補充指定元素。 前言 作為一名python的腦殘粉,請先跟我念一遍python大法好。 其作為動態語言的靈活,簡介的代碼,確實在某些情況下確實比其他編程語言要好。但你有沒有想過,有時這些靈活的語法,可能會造成一些糟糕的...
摘要:在邁過的大門后正式開始了解變量變量定義當看到的變量定義方式時讓我有一點意外即沒有變量的類型說明符也沒有定義變量的標志符如的的這樣就定義一個變量這個變量的類型取決于變量指向的值行尾不能加分號讓我也是糾結了好一會兒不過還是要入鄉隨俗的慢慢習慣了 在邁過HelloWorld的大門后, 正式開始了解Python 變量 變量定義 當看到Python的變量定義方式時, 讓我有一點意外.即沒有變量的...
摘要:什么是變量假設兩個做數學運算先把乘以,然后加上,最后再加上列表變量名的命名規則變量名命名只能使用字母數字下劃線變量名的首字母不能是數字系統關鍵字,不能用在變量名中保留關鍵字不是系統保留關鍵字,但是不建議作為變量名,否則極易出錯動態語言的特性 什么是變量 假設兩個list做數學運算 >>> [1,2,3,4,5,6] [1,2,3] Traceback (most recent call...
閱讀 1915·2021-11-09 09:46
閱讀 2492·2019-08-30 15:52
閱讀 2455·2019-08-30 15:47
閱讀 1325·2019-08-29 17:11
閱讀 1750·2019-08-29 15:24
閱讀 3508·2019-08-29 14:02
閱讀 2449·2019-08-29 13:27
閱讀 1209·2019-08-29 12:32