Kiểu gõ vịt
Thuộc phần Lập trình hướng đối tượng trong hành trình Python của Coddy. Bài học 24 trên 64.
Duck typing tập trung vào những gì một đối tượng có thể làm, không phải nó là gì. Nếu một đối tượng có các phương thức bạn cần, bạn có thể sử dụng nó, bất kể lớp của nó là gì.
Dưới đây là hai lớp không liên quan nhưng có cùng các phương thức:
class Duck:
def swim(self):
return "Duck swimming"
def quack(self):
return "Quack!"
class Person:
def swim(self):
return "Person swimming"
def quack(self):
return "Person imitating a duck: Quack!"Hãy chú ý rằng Duck và Person không kế thừa từ cùng một lớp cha, nhưng cả hai đều có các phương thức swim() và quack().
Tạo một hàm hoạt động với mọi đối tượng “giống vịt”:
def make_it_swim_and_quack(duck_like_object):
print(duck_like_object.swim())
print(duck_like_object.quack())Hàm (function) này không quan tâm đến kiểu dữ liệu của đối tượng, mà chỉ cần đối tượng có các phương thức cần thiết.
Dùng hàm (function) với cả hai lớp:
make_it_swim_and_quack(Duck())
make_it_swim_and_quack(Person())Đầu ra:
Duck swimming
Quack!
Person swimming
Person imitating a duck: Quack!Thêm một lớp "giống vịt" nữa:
class Robot:
def swim(self):
return "Robot swimming with propellers"
def quack(self):
return "Robot sound: BEEP BEEP!"
make_it_swim_and_quack(Robot())Đầu ra:
Robot swimming with propellers
Robot sound: BEEP BEEP!Điểm chính: Gõ vịt (duck typing) cho phép đa hình mà không cần kế thừa. Nếu một đối tượng có các phương thức bạn cần, bạn có thể dùng nó. Nhờ vậy, code Python linh hoạt và tuân theo nguyên tắc “thà xin tha thứ còn hơn xin phép”.
Thử thách
Trung bìnhTrong thử thách này, bạn sẽ triển khai một hệ thống minh họa kiểu hình vịt với các đối tượng giống tệp khác nhau:
textfile.py: Triển khai lớpTextFilevới các phương thứcread()vàwrite(data)database.py: Triển khai lớpDatabasevới chữ ký phương thức tương ứngnetworkresource.py: Triển khai lớpNetworkResourcevới chữ ký phương thức tương ứngdriver.py- Triển khai các test case để xác minh phần triển khai của bạn hoạt động chính xác
Mỗi tệp có các chú thích TODO chi tiết hướng dẫn bạn triển khai.
Tự làm thử
# TODO: Nhập lớp (class) TextFile từ textfile.py
# TODO: Nhập lớp Database từ database.py
# TODO: Nhập lớp NetworkResource từ networkresource.py
def process_data(data_source, data):
# TODO: Gọi phương thức (method) read() của data_source và in kết quả ra
# TODO: Gọi phương thức write(data) của data_source và in kết quả ra
pass
# Kiểm tra với các nguồn dữ liệu khác nhau. KHÔNG SỬA ĐOẠN CODE KIỂM TRA NÀY
text_file = TextFile()
database = Database()
network = NetworkResource()
print("Processing text file:")
process_data(text_file, "Hello, world!")
print("\
Processing database:")
process_data(database, "User record")
print("\
Processing network resource:")
process_data(network, "GET request")Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTham số selfPhương thứcThuộc tínhPhương thức khởi tạo (__init__)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnHàm super()Ghi đè phương thứcKế thừa đa lớpThứ tự phân giải phương thứcÔn tập: hệ thống phân cấp nhân viên2Decorator
Giới thiệu về decoratorDecorator thuộc tínhDecorator phương thức tĩnhDecorator phương thức lớp5Tính đa hình
Xem lại cách ghi đè phương thứcKiểu gõ vịtLớp và phương thức trừu tượngThiết kế giao diệnÔn tập: máy tính hình học8Các khái niệm OOP nâng cao
Kết hợp và kế thừaMixinPhương thức tĩnh và phương thức lớpDecorator lớpTrình quản lý ngữ cảnhTự luyện tập: Trình biên dịch Python online