在 Python 中,內置函數 type() 和 isinstance() 用於獲取和檢查對象的類型,例如變量,並確定它是否屬於特定類型。
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
此處解釋了以下內容以及示例代碼。
- 獲取並檢查對像類型:
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