type(), isinstance() 在 Python 中獲取和確定類型

商業

在 Python 中,內置函數 type() 和 isinstance() 用於獲取和檢查對象的類型,例如變量,並確定它是否屬於特定類型。

此處解釋了以下內容以及示例代碼。

  • 獲取並檢查對像類型:type()
  • 確定對像類型:type(),isinstance()
    • 使用 type() 確定類型
    • 使用 isinstance() 確定類型
    • type() 和 isinstance() 的區別

可以使用異常處理或內置函數 hasattr() 來確定對像是否具有正確的方法和屬性,而不是確定對象的類型。

獲取並檢查對像類型:類型()

type(object) 是一個函數,它返回作為參數傳遞的對象的類型。這可用於找出對象的類型。

print(type('string'))
# <class 'str'>

print(type(100))
# <class 'int'>

print(type([0, 1, 2]))
# <class 'list'>

type() 的返回值是 str 或 int 等類型對象。

print(type(type('string')))
# <class 'type'>

print(type(str))
# <class 'type'>

確定對像類型:type(),isinstance()

使用 type() 或 isinstance() 來確定類型。

使用 type() 確定類型

通過將 type() 的返回值與任意類型進行比較,可以判斷對像是否為任意類型。

print(type('string') is str)
# True

print(type('string') is int)
# False
def is_str(v):
    return type(v) is str

print(is_str('string'))
# True

print(is_str(100))
# False

print(is_str([0, 1, 2]))
# False

如果要確定它是否是多種類型之一,請使用 in 運算符和多種類型的元組或列表。

def is_str_or_int(v):
    return type(v) in (str, int)

print(is_str_or_int('string'))
# True

print(is_str_or_int(100))
# True

print(is_str_or_int([0, 1, 2]))
# False

也可以定義根據參數類型改變處理的函數。

def type_condition(v):
    if type(v) is str:
        print('type is str')
    elif type(v) is int:
        print('type is int')
    else:
        print('type is not str or int')

type_condition('string')
# type is str

type_condition(100)
# type is int

type_condition([0, 1, 2])
# type is not str or int

使用 isinstance() 確定類型

isinstance(object, class) 是一個函數,如果第一個參數的對像是第二個參數的類型或子類的實例,則返回 true。

第二個參數可以是類型的元組。如果它是任一類型的實例,則返回 true。

print(isinstance('string', str))
# True

print(isinstance(100, str))
# False

print(isinstance(100, (int, str)))
# True

類似於使用 type() 進行類型判斷的例子的函數可以寫成如下

def is_str(v):
    return isinstance(v, str)

print(is_str('string'))
# True

print(is_str(100))
# False

print(is_str([0, 1, 2]))
# False
def is_str_or_int(v):
    return isinstance(v, (int, str))

print(is_str_or_int('string'))
# True

print(is_str_or_int(100))
# True

print(is_str_or_int([0, 1, 2]))
# False
def type_condition(v):
    if isinstance(v, str):
        print('type is str')
    elif isinstance(v, int):
        print('type is int')
    else:
        print('type is not str or int')

type_condition('string')
# type is str

type_condition(100)
# type is int

type_condition([0, 1, 2])
# type is not str or int

type() 和 isinstance() 的區別

type() 和 isinstance() 之間的區別在於 isinstance() 對於繼承指定為第二個參數的類的子類的實例返回 true。

例如,定義了下面的超類(基類)和子類(派生類)

class Base:
    pass

class Derive(Base):
    pass

base = Base()
print(type(base))
# <class '__main__.Base'>

derive = Derive()
print(type(derive))
# <class '__main__.Derive'>

僅當類型匹配時,使用 type() 進行類型確定才會返回 true,但即使對於超類,isinstance() 也會返回 true。

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

即使對於標準類型,例如布爾類型 bool (true,false),也必須小心。 bool 是整數類型的子類,因此 isinstance() 即使對於繼承它的 int 也會返回 true。

print(type(True))
# <class 'bool'>

print(type(True) is bool)
# True

print(type(True) is int)
# False

print(isinstance(True, bool))
# True

print(isinstance(True, int))
# True

如果要確定確切的類型,請使用 type();如果要確定考慮繼承的類型,請使用 isinstance()。

還提供了內置函數 issubclass() 來判斷一個類是否是另一個類的子類。

print(issubclass(bool, int))
# True

print(issubclass(bool, float))
# False
Copied title and URL