類型檢查

Python SELF TW
等級 16 , 課堂 3
開放

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() 常用於元編程和撰寫處理動態類型和類別的代碼。關於這一點,我們以後再聊 :)

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION