isinstance(obj,cls)檢查是否obj是不是類 cls 的對象
提到 isinstance 不得不提一下type
帶入場景-->
在遊戲項目中,咱們會在每一個接口驗證客戶端傳過來的參數類型,若是驗證不經過,返回給客戶端「參數錯誤」錯誤碼。
這樣作不但便於調試,並且增長健壯性。由於客戶端是能夠做弊的,不要輕易相信客戶端傳過來的參數。
驗證類型用type函數,很是好用,好比python
print(type('foo') == str) # True print(type(2.3) in (int, float)) # True
既然有了type()來判斷類型,爲何還有isinstance()呢?
一個明顯的區別是在判斷子類。
type()不會認爲子類是一種父類類型;isinstance()會認爲子類是一種父類類型。
千言不如一碼。函數
class Foo(object): pass class Bar(Foo): pass print(type(Foo()) == Foo) # 輸出結果 # True print(type(Bar()) == Foo) # 輸出結果 # False # isinstance參數爲對象和類 print(isinstance(Bar(),Foo)) # 輸出結果 # True
type在python2和python3中的區別:
須要注意的是,舊式類跟新式類的type()結果是不同的。舊式類都是<type 'instance'>。因此這場景不推薦type調試
# python2.+ class A: pass class B: pass class C(object): pass print('old style class',type(A())) # old style class <type 'instance'> print('old style class',type(B())) # old style class <type 'instance'> print('new style class',type(C())) # new style class <class '__main__.C'> print(type(A()) == type(B())) # True
isinstance列子
上代碼code
def add_num(a,b): if isinstance(a,int) and isinstance(b,int): return a+b return None print(add_num(20,10))
我的大白話:
不存在說isinstance比type更好。只有哪一個更適合需求。根據不一樣場景選擇
type()明確顯示出該實例的類型(至關於查看該實例的__class__屬性),不管這個類由哪個類派生而來,type所表示的都是直接生成該實例的類的類型。
type()不會認爲子類是一種父類類型。
isinstance()會認爲子類是一種父類類型。
在程序中遇到須要判斷變量類型的狀況時仍是須要使用isinstance,儘可能不用type,不一樣版本會出問題。對象
issubclass(sub, super)檢查sub類是不是 super 類的派生類
上代碼
代碼1接口
class Parent: pass class Sub(Parent): pass print(issubclass(Sub, Parent)) # True print(issubclass(Parent, object)) # True
代碼2遊戲
class Animal: def eat(self): print("動物得吃東西...") class Pig(Animal): def eat(self): print("豬得吃 豬食....") class Tree: def light(self): print("植物光合做用....") pig = Pig() t = Tree() def manage(obj): if issubclass(type(obj),Animal): obj.eat() else: print("不是一頭動物!") # manage(pig) manage(t) print(issubclass(Tree,object))