Python issubclass和isinstance函式:檢查型別
阿新 • • 發佈:2021-07-20
Python 提供瞭如下兩個函式來檢查型別:
- issubclass(cls, class_or_tuple):檢查 cls 是否為後一個類或元組包含的多個類中任意類的子類。
- isinstance(obj, class_or_tuple):檢查 obj 是否為後一個類或元組包含的多個類中任意類的物件。
通過使用上面兩個函式,程式可以方便地先執行檢查,然後才呼叫方法,這樣可以保證程式不會出現意外情況。
如下程式示範了通過這兩個函式來檢查型別:
# 定義一個字串 hello = "Hello"; # "Hello"是str類的例項,輸出True print('"Hello"是否是str類的例項: ', isinstance(hello, str)) # "Hello"是object類的子類的例項,輸出True print('"Hello"是否是object類的例項: ', isinstance(hello, object)) # str是object類的子類,輸出True print('str是否是object類的子類: ', issubclass(str, object)) # "Hello"不是tuple類及其子類的例項,輸出False print('"Hello"是否是tuple類的例項: ', isinstance(hello, tuple)) # str不是tuple類的子類,輸出False print('str是否是tuple類的子類: ', issubclass(str, tuple)) # 定義一個列表 my_list = [2, 4] # [2, 4]是list類的例項,輸出True print('[2, 4]是否是list類的例項: ', isinstance(my_list, list)) # [2, 4]是object類的子類的例項,輸出True print('[2, 4]是否是object類及其子類的例項: ', isinstance(my_list, object)) # list是object類的子類,輸出True print('list是否是object類的子類: ', issubclass(list, object)) # [2, 4]不是tuple類及其子類的例項,輸出False print('[2, 4]是否是tuple類及其子類的例項: ', isinstance([2, 4], tuple)) # list不是tuple類的子類,輸出False print('list是否是tuple類的子類: ', issubclass(list, tuple))
通過上面程式可以看出,issubclass() 和 isinstance() 兩個函式的用法差不多,區別只是 issubclass() 的第一個引數是類名,而 isinstance() 的第一個引數是變數,這也與兩個函式的意義對應:issubclass 用於判斷是否為子類,而 isinstance() 用於判斷是否為該類或子類的例項。
issubclass() 和 isinstance() 兩個函式的第二個引數都可使用元組。例如如下程式碼:
data = (20, 'fkit') print('data是否為列表或元組: ', isinstance(data, (list, tuple))) # True # str不是list或者tuple的子類,輸出False print('str是否為list或tuple的子類: ', issubclass(str, (list, tuple))) # str是list或tuple或object的子類,輸出True print('str是否為list或tuple或object的子類 ', issubclass(str, (list, tuple, object)))
此外,Python 為所有類都提供了一個 __bases__ 屬性,通過該屬性可以檢視該類的所有直接父類,該屬性返回所有直接父類組成的元組。例如如下程式碼:
class A: pass class B: pass class C(A, B): pass print('類A的所有父類:', A.__bases__) print('類B的所有父類:', B.__bases__) print('類C的所有父類:', C.__bases__)
執行上面程式,可以看到如下執行結果:
類A的所有父類: (<class 'object'>,) 類B的所有父類: (<class 'object'>,) 類C的所有父類: (<class '__main__.A'>, <class '__main__.B'>)
從上面的執行結果可以看出,如果在定義類時沒有顯式指定它的父類,則這些類預設的父類是 object 類。
Python 還為所有類都提供了一個 __subclasses__() 方法,通過該方法可以檢視該類的所有直接子類,該方法返回該類的所有子類組成的列表。例如在上面程式中增加如下兩行:
print('類A的所有子類:', A.__subclasses__()) print('類B的所有子類:', B.__subclasses__())
執行上面程式碼,可以看到如下輸出結果:
類A的所有子類: [<class '__main__.C'>] 類B的所有子類: [<class '__main__.C'>]天道酬勤 循序漸進 技壓群雄