如何在 Python 中檢查資料類型(type 與 isinstance)

了解如何在 Python 中檢查資料類型。了解何時使用 type() 與 isinstance()、處理自訂類別以及編寫安全類型檢查驗證。

在編輯器中嘗試此解決方案

概述

Python 是一種動態類型語言,這意味著變數可以保存任何資料類型的值,並且它們的類型可以在執行過程中更改。雖然這種靈活性可以加快初始開發速度,但它還要求您在運行特定於類型的操作(例如對整數執行算術或呼叫字串方法)之前在運行時驗證變數類型。

為了檢查物件的資料類型,Python 提供了兩個主要函數:「type()」和「isinstance()」。 `type(obj)` 函數傳回物件的精確類別類型。雖然您可以使用 type(obj) == int 來驗證數字是否為整數,但通常不鼓勵使用此方法,因為它不支援繼承結構(整數的子類別將計算為 False)。

建議的檢查類型的 Python 方法是「isinstance(obj, class_info)」。此函數檢查物件是否是指定類別或從該類別繼承的任何子類別的實例。它還支援檢查類元組(例如,“isinstance(value, (int, float))”),使驗證程式碼高度靈活和健全。

程式碼和執行輸出

此腳本示範了使用 type() 和 isinstance() 檢查變數類型,顯示繼承方面的差異。

value_int = 42
value_str = "hello"

# 1. Checking type using isinstance() (Recommended)
is_number = isinstance(value_int, int)
print(f"Is {value_int} an int? {is_number}")

# Checking against multiple possible types
is_num_or_str = isinstance(value_str, (int, float, str))
print(f"Is '{value_str}' int, float, or str? {is_num_or_str}")

# 2. Checking type using type() (For exact class matches)
print(f"Exact type of value_int: {type(value_int).__name__}")
print("Is value_int exactly an int?", type(value_int) is int)

# 3. Inheritance difference
class CustomList(list):
    pass

my_list = CustomList([1, 2, 3])

print("\nInheritance testing:")
print("isinstance(my_list, list):", isinstance(my_list, list))
print("type(my_list) is list:", type(my_list) is list)
端子輸出
Is 42 an int? True
Is 'hello' int, float, or str? True
Exact type of value_int: int
Is value_int exactly an int? True

Inheritance testing:
isinstance(my_list, list): True
type(my_list) is list: False

逐步實施

  • 使用 isinstance(variable, type_name) 進行一般型別檢查(符合繼承)。
  • 傳遞 isinstance(variable, (int, float)) 等類型的元組來檢查多個類別。
  • 只有當必須保證類別的精確匹配而忽略子類別時,才使用 type(variable) is type_name 。

常見問題解答

為什麼 isinstance() 優於 type()?

isinstance() 支援物件繼承和多態性。如果您對內建類型進行子類化,isinstance() 將正確地將其識別為父類別的實例,而 type() 將計算為 False。

如何檢查物件是否可呼叫(如函數)?

使用內建的 callable() 函數,如果物件可以像函數一樣調用,則該函數傳回 True。

相關主題

推薦的 Python 資源

透過相關的互動式教學、備忘單和程式碼比較來擴展您的知識。