Gợi ý kiểu (Type Hints)

Lập trình Hướng đối tượng Nâng cao với Python

Jake Roach

Data Engineer

Mã không có gợi ý kiểu

class Student:
    def __init__(self, name, student_id, tuition_balance):
        self.name = name
        self.student_id = student_id
        self.tuition_balance = tuition_balance

# Tạo lớp có thể khó
walker = Student("Sarah Walker", 319921, 15000)
  • student_id có phải là số nguyên không?
  • tuition_balance nên là float hay int? Hay chuỗi?
  • Sau khi tạo walker, làm sao nhớ kiểu của nó về sau?
Lập trình Hướng đối tượng Nâng cao với Python

Gợi ý kiểu

Công cụ tùy chọn để thêm thông tin về đối tượng vào mã

  • Dễ đọc, dễ gỡ lỗi
  • Một trong những cách tốt nhất để thể hiện kỹ năng Python cấp doanh nghiệp
  • Không bị trình thông dịch ép buộc
  • Từ khóa kiểu dựng sẵn, thư viện typing, lớp tùy chỉnh
# Thêm gợi ý kiểu khi tạo 
# biến
gpa: float = 3.92
# Thêm gợi ý kiểu cho 
# hàm/phương thức
def check_grades(year: str) -> List[int]:
    ...
# Có thể dùng cả lớp tùy chỉnh
students: Dict[str, Student] = {...}
Lập trình Hướng đối tượng Nâng cao với Python

Gợi ý kiểu với từ khóa kiểu dựng sẵn

# Gợi ý kiểu cho logic khai báo
name: str = "Frost"  # Trước đây: name = "Frost"
student_id: int = 91031367
tuition_balance: float = 17452.78
# Gợi ý kiểu cho định nghĩa hàm/phương thức
def get_schedule(semester: str) -> dict:
    ...
  • Dùng cú pháp variable: type
  • Khai báo, thể hiện chữ ký hàm/phương thức
  • Dùng def .... () -> type: để chỉ kiểu trả về
Lập trình Hướng đối tượng Nâng cao với Python

Thư viện typing

typing là thư viện cung cấp nhiều công cụ gợi ý kiểu hơn

  • List, Dict, Tuple
  • Gợi ý cho đối tượng cấp cao và phần tử bên trong
from typing import List, Dict

student_names: List[str] = ["Morgan", "Chuck", "Anna"]
student_gpas: Dict[str, float] = {
    "Casey": 3.71,
    "Sarah": 4.0
}
  • Any, Set, Iterator, Callable
Lập trình Hướng đối tượng Nâng cao với Python

Gợi ý kiểu với lớp tùy chỉnh

class Student:
    def __init__(self, name: str, student_id: int, tuition_balance: float) -> None:
        self.name: str = name
        self.student_id: int = student_id
        self.tuition_balance: float = tuition_balance

    def get_course(self, course_id: str) -> Course:
        ...
        return course
# Dùng Student và Course để gợi ý kiểu
walker: Student = Student("Sarah Walker", 319921, 15000)
data_science: Course = walker.get_course("TDM-20100")
Lập trình Hướng đối tượng Nâng cao với Python

Kiểm tra kiểu đối tượng

# walker: Student = Student("Sarah Walker", 319921, 15000)
print(type(walker))
<class '__main__.Student'>
# data_science: Course = walker.get_course("TDM-20100")
print(type(data_science))
<class '__main__.Course'>
Lập trình Hướng đối tượng Nâng cao với Python

Ayo berlatih!

Lập trình Hướng đối tượng Nâng cao với Python

Preparing Video For Download...