1. 程式人生 > >python中type與isinstance異同

python中type與isinstance異同

在python中,經常會使用到type與isinstance兩個內建的函式來判斷變數屬於什麼型別。那麼這兩個函式有什麼區別呢?下面來簡單分析一下。

1.type

type函式的原始碼如下:

    def __init__(cls, what, bases=None, dict=None): # known special case of type.__init__
        """
        type(object) -> the object's type
        type(name, bases, dict) -> a new type
        # (copied from class doc)
        """
        pass

此部分程式碼位於__builtin__.py中。從這段程式碼可以看出,type函式的用法很簡單,就是type(object),返回的是傳入的object的型別。

2.isinstance

isinstance函式的原始碼:

def isinstance(p_object, class_or_type_or_tuple): # real signature unknown; restored from __doc__
    """
    isinstance(object, class-or-type-or-tuple) -> bool
    
    Return whether an object is an instance of a class or of a subclass thereof.
    With a type as second argument, return whether that is the object's type.
    The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for
    isinstance(x, A) or isinstance(x, B) or ... (etc.).
    """
    return False

isinstance的用法為:

isinstance(object,type-or-tuple-or-class) -> bool
傳入的第一個引數為物件,第二個引數為型別名(int,str,float等)或者型別名的一個列表(如(str, str, int)為一個列表),返回值為一個布林變數。

3.兩個函式的異同

相同點
都可以判斷變數是否屬於某個內建型別。

不同點
1.type只接受一個引數,不僅可以判斷變數是否屬於某個型別,還可以直接返回引數型別。而isinstance只能判斷是否屬於某個已知的型別,不能直接得到變數所屬的型別。

2.isinstance可以判斷子類例項物件是屬於父類的;而type會判斷子類例項物件和父類型別不一樣。

class A1(object):
    pass


class B1(A1):
    pass


print type(A1()) is A1
print type(B1()) is A1
print isinstance(B1(), B1)

輸出結果為:

True
False
True

從以上的分析可以看出,type主要是用來獲取未知變數的型別,而instance可以用於繼承關係的判斷

4.舊式類type

舊式類與新式類的type()結果是不一樣的。舊式類type的結果都為<type ‘instance’>。

class A1(object):
    pass


class B1(A1):
    pass


class C1:
    pass


print type(B1())
print type(C1())
print type(C1()) is C1

結果如下:

<class '__main__.B1'>
<type 'instance'>
False