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