博客專欄

        EEPW首頁 > 博客 > Python數據類型判斷存在問題總結

        Python數據類型判斷存在問題總結

        發布人:扣丁學堂 時間:2020-06-22 來源:工程師 發布文章

          今天扣丁學堂小編給大家介紹一下關于python視頻教程之判斷變量數據類型時,建議使用isinstance()方法代替type().進行類型檢查首先想到的就是用type(),但是Type在某些特定情況下判斷類型存在問題,今天就來說下type在python類型判斷時的坑。

        1.jpeg

          type()方法


          例子:int類型判斷


          >>>importtypes


          >>>type(2017)==types.IntType


          True


          Python2.7中的types類型:


          types.BooleanType#bool類型


          types.BufferType#buffer類型


          types.BuiltinFunctionType#內建函數,比如len()


          types.BuiltinMethodType#內建方法,指的是類中的方法


          types.ClassType#類類型


          types.CodeType#代碼塊類型


          types.ComplexType#復數類型


          types.DictProxyType#字典代理類型


          types.DictType#字典類型


          types.DictionaryType#字典備用的類型


          types.EllipsisType


          types.FileType#文件類型


          types.FloatType#浮點類型


          types.FrameType


          types.FunctionType#函數類型


          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進行了類型的精簡


          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進行類型檢查呢?我們來看一下下面的例子。


          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的,所以這個判斷是存在問題的,當我們對Python內建類型進行擴展的時候,type返回的結果就不夠準確了。我們再看一個例子。


          classca:


          pass


          classcb:


          pass


          a=ca()


          b=cb()


          print(type(a)istype(b))


          代碼的輸出結果:True


          注意:這個例子僅僅針對Python2.x版本,Python3.x版本中會返回Flase,不存在該問題


          type比較的結果a和b的類型是一樣的,結果明顯是不準確的。在old-styleclass中,任意instance的type都是'instance'。所以絕對不能用type來判斷其類型。


          另外這個問題又與Python的思想有關,正常情況下不應該編寫代碼檢查類型的,而應該直接假設被操作的instance具有你希望的屬性,否則拋出異常。即使需要檢查類型,也應該用isinstance來判斷,這樣你期望類型的subclass也能正常被處理(比如,一個函數需要處理Message類型,那么它應該也能處理Message的子類型MyMessage,所以應該使用isinstance(arg,Message)這樣來判斷而不是type(arg)==Message來判斷)


          小編提醒:盡量不要使用type()方法,多使用isinstance(),這樣可以減少錯誤,最后想要學習Python培訓課程的小伙伴快選擇扣丁學堂學習吧,扣丁學堂不僅有專業的老師還有與時俱進的課程體系和大量的Python視頻供學員觀看學習哦。


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

        LCD顯示屏相關文章:lcd顯示屏原理


        lcd相關文章:lcd原理


        關鍵詞:

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 溧阳市| 临湘市| 江川县| 大关县| 平山县| 犍为县| 湘潭市| 巴林左旗| 天水市| 孙吴县| 西畴县| 麦盖提县| 岳普湖县| 龙海市| 民权县| 成武县| 广昌县| 南昌县| 建德市| 北宁市| 安远县| 黄浦区| 马边| 民勤县| 德州市| 杭锦后旗| 九台市| 和田市| 安庆市| 元阳县| 当涂县| 岢岚县| 韶关市| 和政县| 巴彦淖尔市| 芜湖县| 梁山县| 蕉岭县| 白玉县| 普洱| 汉中市|