Python數(shù)據(jù)類型判斷存在問題總結(jié)
今天扣丁學(xué)堂小編給大家介紹一下關(guān)于python視頻教程之判斷變量數(shù)據(jù)類型時,建議使用isinstance()方法代替type().進(jìn)行類型檢查首先想到的就是用type(),但是Type在某些特定情況下判斷類型存在問題,今天就來說下type在python類型判斷時的坑。
type()方法
例子:int類型判斷
>>>importtypes
>>>type(2017)==types.IntType
True
Python2.7中的types類型:
types.BooleanType#bool類型
types.BufferType#buffer類型
types.BuiltinFunctionType#內(nèi)建函數(shù),比如len()
types.BuiltinMethodType#內(nèi)建方法,指的是類中的方法
types.ClassType#類類型
types.CodeType#代碼塊類型
types.ComplexType#復(fù)數(shù)類型
types.DictProxyType#字典代理類型
types.DictType#字典類型
types.DictionaryType#字典備用的類型
types.EllipsisType
types.FileType#文件類型
types.FloatType#浮點類型
types.FrameType
types.FunctionType#函數(shù)類型
types.GeneratorType
types.GetSetDescriptorType
types.InstanceType#實例類型
types.IntType#int類型
types.LambdaType#lambda類型
types.ListType#列表類型
types.LongType#long類型
types.MemberDescriptorType
types.MethodType#方法類型
types.ModuleType#module類型
types.NoneType#None類型
types.NotImplementedType
types.ObjectType#object類型
types.SliceTypeh
types.StringType#字符串類型
types.StringTypes
types.TracebackType
types.TupleType#元組類型
types.TypeType#類型本身
types.UnboundMethodType
types.UnicodeType
types.XRangeType
Python3.x中的types類型:
types.BuiltinFunctionType
types.BuiltinMethodType
types.CodeType
types.DynamicClassAttribute
types.FrameType
types.FunctionType
types.GeneratorType
types.GetSetDescriptorType
types.LambdaType
types.MappingProxyType
types.MemberDescriptorType
types.MethodType
types.ModuleType
types.SimpleNamespace
types.TracebackType
types.new_class
types.prepare_class
Python3.x進(jìn)行了類型的精簡
isinstance方法
isinstance(object,classinfo)object表示實例,classinfo可以是直接或間接類名、基本類型或者有它們組成的元組。
>>>isinstance(1,int)
True
>>>
>>>isinstance('pythontab.com',(str,int))#是其中一種即可
True
>>>isinstance(100,(str,int))#是其中一種即可
True
上面type的例子可以表示為:
>>>importtypes
>>>isinstance(2017,int)
True
那為什么不推薦使用type進(jìn)行類型檢查呢?我們來看一下下面的例子。
importtypes
classUserInt(int):
def__init__(self,val=0):
self.val=int(val)
i=1
n=UserInt(2)
print(type(i)istype(n))
上面的代碼輸出:False
這就說明i和n的類型是不一樣的,而實際上UserInt是繼承自int的,所以這個判斷是存在問題的,當(dāng)我們對Python內(nèi)建類型進(jìn)行擴展的時候,type返回的結(jié)果就不夠準(zhǔn)確了。我們再看一個例子。
classca:
pass
classcb:
pass
a=ca()
b=cb()
print(type(a)istype(b))
代碼的輸出結(jié)果:True
注意:這個例子僅僅針對Python2.x版本,Python3.x版本中會返回Flase,不存在該問題
type比較的結(jié)果a和b的類型是一樣的,結(jié)果明顯是不準(zhǔn)確的。在old-styleclass中,任意instance的type都是'instance'。所以絕對不能用type來判斷其類型。
另外這個問題又與Python的思想有關(guān),正常情況下不應(yīng)該編寫代碼檢查類型的,而應(yīng)該直接假設(shè)被操作的instance具有你希望的屬性,否則拋出異常。即使需要檢查類型,也應(yīng)該用isinstance來判斷,這樣你期望類型的subclass也能正常被處理(比如,一個函數(shù)需要處理Message類型,那么它應(yīng)該也能處理Message的子類型MyMessage,所以應(yīng)該使用isinstance(arg,Message)這樣來判斷而不是type(arg)==Message來判斷)
小編提醒:盡量不要使用type()方法,多使用isinstance(),這樣可以減少錯誤,最后想要學(xué)習(xí)Python培訓(xùn)課程的小伙伴快選擇扣丁學(xué)堂學(xué)習(xí)吧,扣丁學(xué)堂不僅有專業(yè)的老師還有與時俱進(jìn)的課程體系和大量的Python視頻供學(xué)員觀看學(xué)習(xí)哦。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。
LCD顯示屏相關(guān)文章:lcd顯示屏原理
lcd相關(guān)文章:lcd原理