CodeGym /Các khóa học /Python SELF VI /Kiểm tra kiểu dữ liệu

Kiểm tra kiểu dữ liệu

Python SELF VI
Mức độ , Bài học
Có sẵn

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()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ỉ địnhFalse 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 :)

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION