Đa hình OOP của Python: Giao diện và gõ vịt

Làm chủ tính đa hình trong Python. Tìm hiểu cách viết mã linh hoạt, liên kết lỏng lẻo bằng cách sử dụng kiểu gõ vịt, ghi đè phương thức và các lớp cơ sở trừu tượng.

Thử trong Trình chỉnh sửa

Tổng quan

Đa hình là một thuật ngữ tiếng Hy Lạp có nghĩa là “nhiều hình thức”. Trong Lập trình hướng đối tượng, nó đề cập đến khả năng của các lớp khác nhau đáp ứng cùng một lệnh gọi phương thức theo cách riêng của chúng. Tính đa hình cho phép bạn viết một hàm duy nhất có thể xử lý nhiều loại đối tượng khác nhau, miễn là chúng có chung một giao diện. Điều này cho phép khả năng ghép nối thấp và làm cho hệ thống phần mềm của bạn có khả năng thích ứng cao và dễ dàng mở rộng.

Trong Python, tính đa hình gắn liền với một khái niệm được gọi là Duck Typing. Thuật ngữ này xuất phát từ câu: "Nếu nó đi như một con vịt và kêu như một con vịt thì nó phải là một con vịt". Trong Python được gõ động, một hàm không quan tâm đối tượng thuộc về lớp nào; nó chỉ quan tâm liệu đối tượng đó có thực hiện các phương thức được yêu cầu hay không. Ví dụ: nếu bạn có một hàm gọi `.speak()`, bạn có thể chuyển nó thành Chó, Mèo hoặc Robot—miễn là tất cả chúng đều có phương thức `.speak()`, thì mã sẽ chạy hoàn hảo.

Đối với các kiến trúc chặt chẽ hơn, Python cung cấp các Lớp cơ sở trừu tượng (ABC) thông qua mô-đun `abc` tích hợp sẵn. Bằng cách kế thừa từ `abc.ABC` và sử dụng trình trang trí `@abstractmethod`, bạn có thể xác định các giao diện chính thức mà các lớp con buộc phải triển khai. Nếu một lớp con không xác định được các phương thức trừu tượng, Python sẽ đưa ra TypeError khi bạn cố gắng khởi tạo nó. Cân bằng kiểu gõ vịt linh hoạt với các lớp trừu tượng chính thức là một kỹ năng quan trọng để thiết kế các thư viện Python linh hoạt.

Đầu ra mã & thực thi

Triển khai các lớp đa hình biểu diễn các hình dạng tính toán diện tích của chúng.

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        """Must be implemented by subclasses."""
        pass

class Square(Shape):
    def __init__(self, side):
        self.side = side
    def area(self):
        return self.side * self.side

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        import math
        return math.pi * (self.radius ** 2)

# Polymorphic function accepting any Shape
def print_area(shape: Shape):
    print(f"Calculated Area: {shape.area():.2f}")

print_area(Square(4))
print_area(Circle(3))
Đầu ra thiết bị đầu cuối
Calculated Area: 16.00
Calculated Area: 28.27

Triển khai từng bước

  • Viết bộ xử lý thanh toán xử lý các đối tượng CreditCard, PayPal và Stripe
  • Vẽ các phần tử khác nhau (Văn bản, Hình ảnh) bằng vòng lặp hiển thị thống nhất
  • Mô phỏng các kết nối API bên ngoài trong quá trình thử nghiệm đơn vị

Câu hỏi thường gặp

Gõ vịt là gì?

Đó là cách tiếp cận năng động của Python đối với tính đa hình. Nó kiểm tra sự hiện diện của các phương thức và thuộc tính trong thời gian chạy thay vì xác minh tính kế thừa từ một lớp cha cụ thể.

Bạn có thể khởi tạo một Lớp cơ sở trừu tượng không?

Không. Việc cố gắng khởi tạo một lớp kế thừa từ ABC và chứa các phương thức trừu tượng sẽ gây ra Lỗi Loại.

Chủ đề liên quan

Tài nguyên Python được đề xuất

Mở rộng kiến thức của bạn với các hướng dẫn tương tác, bảng ghi chú và so sánh mã có liên quan.