Python cung cấp 2 cách chính để kiểm tra kiểu của đối tượng: type() (kiểu chính xác) và isinstance() (kiểm tra kế thừa/hierarchy).
1. type(object)
Trả về đối tượng type của object. So sánh chính xác (exact type).
Ví dụ
val = 5 print(type(val)) #print(type(val) == int) # True print(type(val) == float) # False # Kiểm tra type chính xác if type(val) is int: print("Là int chính xác")
2. isinstance(object, classinfo)
Trả về True nếu object là instance của classinfo hoặc subclass của nó. Hỗ trợ tuple các class.
Ví dụ cơ bản
nums = {1, 2, 3}
print(isinstance(nums, set)) # True
print(isinstance(nums, (set, list, dict))) # True (tuple check)
# Với inheritance
class Animal: pass
class Dog(Animal): pass
dog = Dog()
print(isinstance(dog, Dog)) # True
print(isinstance(dog, Animal)) # True (subclass)
print(isinstance(dog, object)) # True (mọi class kế thừa object)So sánh type() vs isinstance()
| Tiêu chí | type() | isinstance() |
|---|---|---|
| Kiểm tra kế thừa | Không (chỉ exact type) | Có (True cho subclass) |
| Đa kiểu (tuple) | Không | Có: isinstance(x, (int, float)) |
| Hiệu năng | Nhanh hơn chút | Chậm hơn không đáng kể |
| Best practice | Hiếm dùng trực tiếp | Khuyến nghị (PEP 8, polymorphic code) |
Ví dụ thực tế: Kiểm tra số (int hoặc float)
def process_number(value):
if isinstance(value, (int, float)) and not isinstance(value, bool):
# bool là subclass của int trong Python!
print(f"Xử lý số: {value}")
else:
print("Không phải số")
process_number(10) # OK
process_number(3.14) # OK
process_number(True) # Không phải số (loại trừ bool)
process_number("10") # Không phải sốKết luận
Luôn ưu tiên isinstance() cho type checking trong code production. Dùng type() is SomeClass chỉ khi cần kiểm tra chính xác kiểu (ví dụ: serialization, debug). Nhớ loại trừ bool khi kiểm tra số vì bool subclass int.