Menu
CoddyTech

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”.

challenge icon

Thử thách

Trung bình

Trong 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ớp TextFile với các phương thức read() và write(data)
  • database.py: Triển khai lớp Database với chữ ký phương thức tương ứng
  • networkresource.py: Triển khai lớp NetworkResource với chữ ký phương thức tương ứng
  • driver.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")
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Python online