Đ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.
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))Calculated Area: 16.00
Calculated Area: 28.27Triể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
Giới thiệu đầy đủ về các lớp, đối tượng, kế thừa và khái niệm OOP của Python. Tạo các mô hình dữ liệu mạnh mẽ và mở rộng quy mô ứng dụng python của bạn.
Kế thừa Python OOPTìm hiểu tính kế thừa trong Python OOP. Phân lớp chính, các phương thức ghi đè, sử dụng super() và nhiều mẫu kế thừa.
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.
Cách sắp xếp danh sách trong Python
Tìm hiểu cách sắp xếp danh sách trong Python bằng phương thức Sort() và hàm Sort(). Khám phá các ví dụ về sắp xếp khóa tùy chỉnh và thứ tự đảo ngược.
Bảng cheat phương thức chuỗi Python
Hướng dẫn tham khảo đầy đủ về thao tác chuỗi Python. Làm chủ định dạng, tìm kiếm, phân tách, thay thế và kiểm tra thuộc tính chuỗi.
Python vs JavaScript: Ngôn ngữ lập trình nào tốt nhất?
So sánh toàn diện giữa Python và JavaScript. Khám phá sự khác biệt về cú pháp, hiệu suất, trường hợp sử dụng (phụ trợ so với giao diện người dùng) và các ví dụ về mã hóa.