類型檢查

開放

9.1 函數 type()

在 Python 中有幾個內建函數可以用來檢查物件的類型和類別。這些函數對於編寫靈活且安全的代碼非常有用,特別是在處理不同資料類型時。

下面我會介紹一些最常用的函數:type()isinstance()issubclass(),還有一些用於類型註解的函數,如 getattr()hasattr()

函數 type()

函數 type() 會返回物件的類型。你可能已經用過它,對吧?

x = 10
print(type(x))  # 輸出: <class 'int'>

但你可能不知道,它還可以用來創建新類別!

創建新類別

如果傳入三個參數,它會創建一個新的類型(類別)。

該操作的簽名是:

type(name, bases, dict)

其中:

  • name — 要創建的類別名稱(字串)。
  • bases — 基類(父類)的元組,新類別將從中繼承。
  • dict — 包含新類別的屬性和方法的字典。

創建簡單類別:

MyClass = type('MyClass', (), {'say_hello': lambda self: print("Hello!")})

# 創建類別實例
instance = MyClass()
instance.say_hello()  # 輸出: Hello!

你甚至可以創建更複雜的東西:

MyClass = type('MyClass', (), {
    'attribute': 42,
    '__init__': lambda self, value: setattr(self, 'value', value),
    'display_value': lambda self: print(self.value)
})

# 創建類別實例
instance = MyClass(10)
print(instance.attribute)  # 輸出: 42
instance.display_value()  # 輸出: 10

所以現在你不僅可以確定物件的類型,還可以創建類別,為它們創建實例,然後確定它們的類型。

9.2 函數 isinstance()

函數 isinstance() 是一個內建的 Python 函數,用於檢查物件是否屬於某個特定的類別或類別的元組。如果物件是指定類別的實例或是元組中任何一個指定類別的實例,則它返回 True,否則返回 False

簽名和參數:

isinstance(object, classinfo)

其中:

  • object — 需要檢查其類別的物件。
  • classinfo — 類別、類型或類別和類型的元組,與之對比檢查物件。

使用範例:

檢查是否屬於某個類別

x = 10
print(isinstance(x, int))  # 輸出: True

y = "Hello"
print(isinstance(y, str))  # 輸出: True

檢查是否屬於多個類別 — 至少其中之一:

x = 10
print(isinstance(x, (int, float)))  # 輸出: True

y = "Hello"
print(isinstance(y, (int, str)))  # 輸出: True

z = 3.14
print(isinstance(z, (int, str)))  # 輸出: False

檢查是否屬於自定義類別

class Animal:
    pass

class Dog(Animal):
    pass

dog = Dog()

print(isinstance(dog, Dog))  # 輸出: True
print(isinstance(dog, Animal))  # 輸出: True

與使用 type() 直接比較類型不同,isinstance() 可以正確處理繼承,檢查物件是否屬於繼承階層中的任何類別。

9.3 函數 issubclass()

函數 issubclass() 是 Python 的內建函數,用於檢查指定的類別是否是另一個類別或類別元組的子類別。當第一個參數確實是第二個參數的子類別時,該函數返回 True,否則返回 False

簽名和參數:

issubclass(class, classinfo)

其中:

  • class — 需要檢查其是否為子類別的類別。
  • classinfo — 類別、類型或類別和類型的元組,與之對比檢查第一個參數。

使用範例:

檢查是否為某個類別的子類別

class Animal:
    pass

class Dog(Animal):
    pass

print(issubclass(Dog, Animal))  # 輸出: True
print(issubclass(Animal, Dog))  # 輸出: False

檢查是否為多個類別之一的子類別 — 至少其中之一:

class Animal:
    pass

class Dog(Animal):
    pass

class Cat(Animal):
    pass

print(issubclass(Dog, (Animal, Cat)))  # 輸出: True
print(issubclass(Dog, (Cat,)))  # 輸出: False

自定義類別範例

從內建類別繼承

class MyInt(int):
    pass

print(issubclass(MyInt, int))  # 輸出: True
print(issubclass(int, MyInt))  # 輸出: False

繼承階層

class A:
    pass

class B(A):
    pass

class C(B):
    pass

print(issubclass(C, A))  # 輸出: True
print(issubclass(C, B))  # 輸出: True
print(issubclass(B, A))  # 輸出: True
print(issubclass(A, C))  # 輸出: False

使用 issubclass() 的好處

檢查類別階層: issubclass() 允許檢查類別階層,這對於確保繼承關係和代碼結構的正確性非常有用。

靈活性: 該函數支持檢查單一類別或類別元組,使其在不同場景中使用時非常靈活。

方便元編程: issubclass() 常用於元編程和撰寫處理動態類型和類別的代碼。關於這一點,我們以後再聊 :)

2
任務
Python SELF TW,  等級 16課堂 3
上鎖
寵物。
寵物。
2
任務
Python SELF TW,  等級 16課堂 3
上鎖
車隊管理。
車隊管理。
留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言