Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Từ khóa super() trong Python
Trong lập trình hướng đối tượng, việc xây dựng và quản lý mối quan hệ giữa các lớp cha và lớp con là một phần quan trọng để đảm bảo mã nguồn được tổ chức gọn gàng, dễ bảo trì và mở rộng. Trong Python, từ khóa super()
là một công cụ mạnh mẽ, giúp các lập trình viên dễ dàng truy cập và tái sử dụng các phương thức hoặc thuộc tính của lớp cha mà không cần lặp lại mã. Bài viết này sẽ giới thiệu chi tiết về super()
, cách hoạt động, ý nghĩa của nó trong kế thừa, và cách áp dụng thông qua các ví dụ minh họa cụ thể.
Giới thiệu về super()
trong Python
Trong Python, từ khóa super
được sử dụng để tham chiếu đến lớp cha. Nó cho phép bạn truy cập các phương thức và biến của lớp cha mà không cần phải chỉ rõ tên lớp cha.
- Điều kiện sử dụng:
super()
chỉ có thể được sử dụng trong các lớp kế thừa từ một hoặc nhiều lớp khác. - Mục đích:
- Giúp gọi phương thức hoặc truy cập thuộc tính từ lớp cha.
- Hỗ trợ cơ chế kế thừa, đặc biệt trong trường hợp có đa kế thừa.
Khi gọi super()
, Python trả về một đối tượng proxy tạm thời của lớp cha, cho phép lớp con gọi phương thức hoặc thuộc tính từ lớp cha một cách linh hoạt.
MRO (Method Resolution Order) trong Python
MRO là cơ chế Python sử dụng để xác định thứ tự tìm kiếm các phương thức khi dùng super()
.
Bài viết này được đăng tại [free tuts .net]
Tình huống dễ nhầm lẫn: Trong đa kế thừa, nếu nhiều lớp cha có cùng một phương thức, Python cần biết phương thức nào nên được gọi. Thứ tự này được xác định bởi MRO.
Bạn có thể kiểm tra thứ tự MRO bằng cách:
ClassName.__mro__
Ví dụ:
(<class '__main__.Car'>, <class '__main__.Vehicle'>, <class 'object'>)
Cách sử dụng super()
trong Python
Dùng trong phương thức __init__()
Ví dụ sau minh họa cách sử dụng super()
để gọi phương thức __init__()
của lớp cha khi khởi tạo đối tượng của lớp con:
class Vehicle: def __init__(self, mode): self.mode = mode print(f"Phương tiện di chuyển: {self.mode}") class Car(Vehicle): def __init__(self, model, make): # Gọi __init__() của lớp cha super().__init__(mode="Đường bộ") self.model = model self.make = make Car("Volkswagen", "Polo")
Kết quả:
Phương tiện di chuyển: Đường bộ
Giải thích:
- Khi tạo đối tượng
Car
, phương thức__init__()
trong lớpVehicle
được gọi thông quasuper()
.
Dùng ngoài phương thức __init__()
Ví dụ sau minh họa cách gọi phương thức của lớp cha bên ngoài __init__()
thông qua super()
:
class Vehicle: def __init__(self, mode): self.mode = mode def print_mode(self): print(f"Phương tiện di chuyển: {self.mode}") class Car(Vehicle): def __init__(self, model, make): super().__init__(mode="Đường bộ") self.model = model self.make = make def print_all_info(self): # Gọi phương thức print_mode() của lớp cha super().print_mode() print(f"Model: {self.model}, Hãng sản xuất: {self.make}") Car("Volkswagen", "Polo").print_all_info()
Kết quả:
Phương tiện di chuyển: Đường bộ Model: Volkswagen, Hãng sản xuất: Polo
Giải thích:
- Phương thức
print_mode()
của lớp cha được gọi từ lớp con thông quasuper()
.
Kiểm tra thứ tự MRO trong Python
Bạn có thể kiểm tra thứ tự MRO để hiểu cách Python tìm kiếm các phương thức trong trường hợp kế thừa.
print(Car.__mro__)
Kết quả:
(<class '__main__.Car'>, <class '__main__.Vehicle'>, <class 'object'>)
Ý nghĩa:
- Python sẽ tìm phương thức trong
Car
trước. - Nếu không tìm thấy, nó sẽ tìm trong
Vehicle
. - Cuối cùng, nó sẽ tìm trong lớp gốc
object
.
Kết bài
super()
là công cụ hữu ích khi làm việc với kế thừa, giúp bạn tránh lặp lại mã nguồn và đảm bảo tính mở rộng của mã.- Trong trường hợp đa kế thừa, MRO đóng vai trò quyết định thứ tự gọi phương thức, giúp đảm bảo tính nhất quán.
Hãy thử áp dụng super()
trong các dự án Python để tối ưu hóa mã và tận dụng sức mạnh của kế thừa!