聊一聊isinstance與type

聊一聊isinstance與type

最近寫代碼的時候遇到了一個關於isinstancetype的坑,這裏給你們分享下,若是你們也遇到了一樣的問題,但願本文能爲你們解決疑惑把。

isinstance(obj,cls)

isinstance有兩個參數,obj表示待比較的對象,cls表示「疑似是obj從屬的類」,返回值是bool類型的True或者False
舉一個簡單的例子:咱們想從一個多層嵌套的列表中獲取每個元素:
A = [1,2,[3,4,[5,6,[7,8,[9,10]]]]]
這種問題咱們能夠用遞歸來解決這類問題:遍歷這個列表,遇到是數字類型的就直接打印,遇到列表類型的繼續「遞歸」。實現代碼以下:
def recursion(lis):
    for i in lis:
        if  isinstance(i,int):
           print(i,end=' ')
        elif isinstance(i,list):
            recursion(i)
if __name__ == '__main__':
    A = [1,2,[3,4,[5,6,[7,8,[9,10]]]]]
    recursion(A)
結果以下:
1 2 3 4 5 6 7 8 9 10
關於本程序的BUG你們能夠忽略,寫成醬紫的是爲了幫助你們分析問題:咱們在recursion函數中使用了isinstance去判斷咱們遍歷的元素是列表類型仍是int類型的,針對每一種類型咱們作出不一樣的處理。

isinstance「認可繼承關係」

何謂isinstance「認可繼承關係」呢?上面的例子可能說明不了問題,咱們在看下面這段代碼:
class GrandFather(object):pass
class Father(GrandFather):pass
class Son(Father):pass
son = Son()
print(isinstance(son,Son))
print(isinstance(son,Father))
print(isinstance(son,GrandFather))
從上面這段代碼能夠看出,類Father繼承自GrandFather,類Son繼承自Father,對象son是類Son實例化的一個對象。
結合小標題,你們猜一猜結果是什麼呢?
對!沒錯!!小夥子你很聰明!!!結果就是:
True
True
True
也就是說,isinstance不止能夠判斷對象與實例化這個對象類的關係,還能接受「繼承關係」。

type(obj[cls])

關於type就頗有意思了:若是type裏的參數是一個對象,那結果會顯示實例化這個對象的類;那麼若是裏面的參數是一個類呢?
趕忙打開你的IDE試試!!!體會一下什麼是Python中一切皆對象!
回到咱們type裏面是一個對象的話題:看下面這段代碼:
print(type(123))
print(type('123'))
print(type([1,2,3]))
print(type((1,2,3)))
print(type({1,2,3}))
咱們要查看這些數據對象的類型,固然咱們一眼就能夠看出來是什麼類型的,so easy~結果以下:
<class 'int'>
<class 'str'>
<class 'list'>
<class 'tuple'>
<class 'set'>
結果正如咱們所料,可是,若是是一個咱們自定義的類實例化出的對象呢?
class Son:pass
son = Son()
print(type(son))
如上所示,咱們利用一個類Son實例化出一個對象son,那麼結合上面的例子,type(son)的值是什麼呢?
沒錯!聰明的你叕叕叕猜對了:
<class '__main__.Son'>
結果就是當前文件的一個叫Son的東東,就是咱們定義的Son類。

type「不認可繼承關係」

說到這裏,相信你會聯想到上面isinstance的例子:要是繼承會如何呢?
class GrandFather:pass
class Father(GrandFather):pass
class Son(Father):pass
son = Son()
print(type(son) is Son)
print(type(son) is Father )
print(type(son) is GrandFather )
這裏你可能猜不到了,先給出結果再進行說明:
True
False
False
咱們能夠看到,只有Son與type(son)相等,也就是說,只有直接實例化這個對象的類纔是type(對象)的類,即便有繼承關係,type也不會「認可」這個類的父類的
對於這個結論,你們記住就行了,但願本文內容能爲你們之後的編碼生涯避免一些BUG的產生!
最後,不知道你試過type(cls)沒有,趕忙打開本身的IDE試試下面這段代碼:
class GrandFather:pass
class Father(GrandFather):pass
class Son(Father):pass
son = Son()

print(type(GrandFather))
print(type(Father))
print(type(Son))
你會發現,結果是同樣的————並且會引出一個十分重要的知識點:元類/驚恐/驚恐/驚恐
相關文章
相關標籤/搜索