9.1 Hàm type()
Trong Python có một vài hàm tích hợp để kiểm tra kiểu và lớp của đối tượng. Những hàm này rất hữu ích để viết mã linh hoạt và an toàn, có thể làm việc với các kiểu dữ liệu khác nhau.
Dưới đây tôi sẽ nói về những hàm phổ biến nhất: type()
, isinstance()
, issubclass()
, và cả những hàm để ghi chú kiểu dữ liệu, như getattr()
và hasattr()
.
Hàm type()
Hàm type()
trả về kiểu của đối tượng. Bạn đã làm việc với nó rồi, phải không?
x = 10
print(type(x)) # Output: <class 'int'>
Nhưng điều mà bạn có thể chưa biết là bạn có thể dùng nó để tạo ra các lớp mới!
Tạo một lớp mới
Nếu truyền vào ba tham số, nó sẽ tạo ra một kiểu (lớp) mới.
Chữ ký của thao tác này:
type(name, bases, dict)
trong đó:
-
name
— tên của lớp được tạo ra (chuỗi). -
bases
— tuple của các lớp cơ bản (cha), từ đó lớp mới được kế thừa. -
dict
— dictionary chứa các thuộc tính và phương thức của lớp mới.
Tạo một lớp đơn giản:
MyClass = type('MyClass', (), {'say_hello': lambda self: print("Hello!")})
# Tạo một instance của lớp
instance = MyClass()
instance.say_hello() # Output: Hello!
Có thể tạo ra thứ gì đó phức tạp hơn:
MyClass = type('MyClass', (), {
'attribute': 42,
'__init__': lambda self, value: setattr(self, 'value', value),
'display_value': lambda self: print(self.value)
})
# Tạo một instance của lớp
instance = MyClass(10)
print(instance.attribute) # Output: 42
instance.display_value() # Output: 10
Vậy bây giờ bạn không chỉ xác định kiểu của đối tượng, mà còn có thể tạo một lớp, tạo ra các đối tượng từ lớp đó, rồi xác định kiểu của chúng.
9.2 Hàm isinstance()
Hàm isinstance()
là một hàm tích hợp trong Python, được sử dụng để kiểm tra xem đối tượng có phải là một instance của lớp hoặc tuple của các lớp hay không. Nó trả về True
nếu đối tượng là một instance của lớp chỉ định hoặc bất kỳ
lớp nào trong tuple chỉ định và False
trong trường hợp ngược lại.
Chữ ký và tham số:
isinstance(object, classinfo)
trong đó:
-
object
— đối tượng cần kiểm tra xem có thuộc về lớp hoặc các lớp chỉ định hay không. -
classinfo
— lớp, kiểu hoặc tuple của các lớp và loại, mà đối tượng sẽ được kiểm tra.
Ví dụ sử dụng:
Kiểm tra xem có thuộc về một lớp
x = 10
print(isinstance(x, int)) # Output: True
y = "Hello"
print(isinstance(y, str)) # Output: True
Kiểm tra xem có thuộc về một trong nhiều lớp — ít nhất một trong các lớp:
x = 10
print(isinstance(x, (int, float))) # Output: True
y = "Hello"
print(isinstance(y, (int, str))) # Output: True
z = 3.14
print(isinstance(z, (int, str))) # Output: False
Kiểm tra thuộc tính của các lớp do người dùng tạo
class Animal:
pass
class Dog(Animal):
pass
dog = Dog()
print(isinstance(dog, Dog)) # Output: True
print(isinstance(dog, Animal)) # Output: True
Khác với việc so sánh kiểu trực tiếp bằng type()
, isinstance()
làm việc chính xác với kế thừa, kiểm tra xem đối tượng có thuộc về bất kỳ lớp nào trong hệ thống phân cấp lớp.
9.3 Hàm issubclass()
Hàm issubclass()
là một hàm tích hợp trong Python, được sử dụng để kiểm tra xem lớp được chỉ định có phải là một lớp con của một lớp khác hay bất kỳ lớp nào trong tuple không. Hàm này trả về True
nếu đối số đầu tiên thực sự là một lớp con của cái thứ hai, và False
trong trường hợp ngược lại.
Chữ ký và tham số:
issubclass(class, classinfo)
trong đó:
-
class
— lớp mà cần kiểm tra xem có thuộc về lớp hoặc các lớp chỉ định không. -
classinfo
— lớp, kiểu hoặc tuple của các lớp và loại, mà đối tượng sẽ được kiểm tra.
Ví dụ sử dụng:
Kiểm tra thuộc tính của một lớp
class Animal:
pass
class Dog(Animal):
pass
print(issubclass(Dog, Animal)) # Output: True
print(issubclass(Animal, Dog)) # Output: False
Kiểm tra thuộc tính của nhiều lớp — ít nhất một lớp:
class Animal:
pass
class Dog(Animal):
pass
class Cat(Animal):
pass
print(issubclass(Dog, (Animal, Cat))) # Output: True
print(issubclass(Dog, (Cat,))) # Output: False
Ví dụ với các lớp do người dùng tạo
Kế thừa từ các lớp tích hợp
class MyInt(int):
pass
print(issubclass(MyInt, int)) # Output: True
print(issubclass(int, MyInt)) # Output: False
Hệ thống phân cấp thừa kế
class A:
pass
class B(A):
pass
class C(B):
pass
print(issubclass(C, A)) # Output: True
print(issubclass(C, B)) # Output: True
print(issubclass(B, A)) # Output: True
print(issubclass(A, C)) # Output: False
Lợi ích của việc sử dụng issubclass()
Kiểm tra hệ thống phân cấp lớp: issubclass()
cho phép kiểm tra hệ thống phân cấp lớp, rất hữu ích để đảm bảo tính đúng đắn của kế thừa và cấu trúc mã.
Tính linh hoạt: Hàm hỗ trợ kiểm tra một lớp hoặc tuple của các lớp, làm cho nó linh hoạt để sử dụng trong nhiều kịch bản khác nhau.
Tiện dụng cho lập trình meta: issubclass()
thường được sử dụng trong lập trình meta và khi viết mã hoạt động với các kiểu và lớp động. Chúng ta sẽ nói về điều này sau :)
GO TO FULL VERSION