python資料型別判斷type與isinstance的區別

pythontab發表於2013-08-27

在專案中,我們會在每個介面驗證客戶端傳過來的引數型別,如果驗證不透過,返回給客戶端“引數錯誤”錯誤碼。

這樣做不但便於除錯,而且增加健壯性。因為客戶端是可以作弊的,不要輕易相信客戶端傳過來的引數。

驗證型別用type函式,非常好用,比如

>>type('foo') == str

True

>>type(2.3) in (int,float)

True

既然有了type()來判斷型別,為什麼還有isinstance()呢?

一個明顯的區別是在判斷子類。

type()不會認為子類是一種父類型別。

isinstance()會認為子類是一種父類型別。

千言不如一碼。

class Foo(object): 
    pass
   
class Bar(Foo): 
    pass
   
print type(Foo()) == Foo 
print type(Bar()) == Foo 
print isinstance(Bar(),Foo) 
  
class Foo(object):
    pass
  
class Bar(Foo):
    pass
  
print type(Foo()) == Foo
print type(Bar()) == Foo
print isinstance(Bar(),Foo)
輸出
True
False
True


需要注意的是,舊式類跟新式類的type()結果是不一樣的。舊式類都是<type 'instance'>。

class A: 
    pass
   
class B: 
    pass
   
class C(object): 
    pass
   
print 'old style class',type(A()) 
print 'old style class',type(B()) 
print 'new style class',type(C()) 
print type(A()) == type(B()) 
  
class A:
    pass
  
class B:
    pass
  
class C(object):
    pass
  
print 'old style class',type(A())
print 'old style class',type(B())
print 'new style class',type(C())
print type(A()) == type(B())
輸出
old style class <type 'instance'>
old style class <type 'instance'>
new style class <class '__main__.C'>
True


不存在說isinstance比type更好。只有哪個更適合需求。


相關文章