但是在實際開發中,為了提高代碼的健壯性,我們還是需要檢查類型。類型檢查首先想到的就是使用type(),比如用type判斷壹個int類型。
如果類型(1)是類型,則導入類型。Integer: print ('1是int類型')else: print('1不是int類型')。
上面的程序會輸出:1是壹個int類型。
我們可以在類型中找到壹些常用的類型,結果如2.7.6所示:
類型。BooleanType # bool類型類型。buffertype # buffertype。builtinfunctiontype #內置函數,例如len()類型。BuiltinMethodType #內置方法,指的是方法類型。ClassType #類類型。CodeType #代碼塊類型。復雜類型類型。字典代理類型類型。字典類型類型。字典類型#字典替代類型。ellipsistypetypes.filetype #文件類型類型。FloatType #浮動類型類型。frametypetypes.functiontype #函數類型類型。生成器類型
類型。getsetdescriptotypetypes . instance type # instance types . int type # int type types . Lambda type # Lambda type types . list type # list type types . long type # long type types . memberdescriptotypetype . Method type #方法類型。moduletype # moduletypes。nonetype # none類型類型。notimplementedtypes。objecttype #對象類型類型. slicetypetypes.stringtype #字符串類型。字符串類型
類型。TracebackType
類型。TupleType #元組類型類型。typetype # type本身的類型。unboundemethodtypes.unicode類型
類型。XRangeType
在Python 3中,類型已經大大減少了。
類型。BuiltinFunctionType
類型。BuiltinMethodType
類型。代碼類型
類型。DynamicClassAttribute
類型。框架類型
類型。函數類型
類型。生成器類型
類型。GetSetDescriptorType
類型。LambdaType
類型。MappingProxyType
類型。MemberDescriptorType
類型。方法類型
類型。模塊類型
類型。簡單命名空間
類型。TracebackType
types.new _ class
types.prepare_class
但是,我們不建議使用type進行類型檢查。之所以列出這些類型,也是為了擴大知識面。那為什麽不推薦使用type進行類型檢查呢?讓我們看看下面的例子。
import typesclass UserInt(int):def _ _ init _ _(self,val = 0):self . val = int(val)I = 1n = UserInt(2)print(type(I)是type(n))
上面的代碼輸出:False
這說明I和N的類型是不壹樣的。實際上UserInt是繼承自Int的,所以這個判斷是有問題的。當我們擴展Python內置類型時,type返回的結果不夠準確。讓我們看另壹個例子。
class A():pass class B():passa = A()B = B()print(類型(A)是類型(B))
代碼輸出結果:True
類型比較a和b的結果是同壹類型,結果明顯不準確。這個古典類的例子,type返回的結果是壹樣的,這樣的結果不是我們想要的。對於內置的基本類型,用tpye檢查是沒問題的,但是應用到其他場合,類型就不靠譜了。這時,我們需要使用isinstance進行類型檢查。
isinstance(object,classinfo)
對象表示壹個實例,classinfo可以是直接或間接的類名、基本類型或由它們組成的元組。
& gt& gt& gtisinstance(2,浮點型)
錯誤的
& gt& gt& gtisinstance('a ',(str,unicode))
真實的
& gt& gt& gtisinstance((2,3),(str,list,tuple))
真實的