Hướng dẫn super() trong python
Khi lập trình hướng đối tượng với Python, ta thường bắt gặp các câu lệnh như Show 1. Kế thừa trong PythonĐể hiểu rõ hơn về vai trò của
Tuy nhiên, sẽ xảy ra trường hợp
Chúng ta cũng có thể giải quyết trường hợp này bằng
Hàm 2. Method resolution order (MRO) MRO có thể hiểu đơn giản là trình tự kế thừa của lớp. MRO của một lớp có thể được truy xuất bằng phương thức
Khi sử dụng một phương thức với đối tượng thuộc lớp Children, chương trình sẽ tìm kiếm phương thức dựa trên thứ tự MRO như trên, tức là bắt đầu từ Children, nếu không có thì sẽ tìm đến Parent và sau cùng là object (base class mặc định cho mọi loại dữ liệu Python) 3. Tham số của hàm super()Hàm
Để dễ hình dung, Xét ví dụ trên, hàm
Ngoài ra
4. Giải quyết Diamond Problem bằng super()Diamond Problem xuất hiện khi ta thực hiện đa kế thừa trên hai lớp cha cùng kế thừa từ một lớp ông nội. Xét trường hợp ta có các lớp sau:
Khi đó chúng ta sẽ gặp các vấn đề phát sinh sau:
Nếu bạn gọi phương thức bằng
Nếu muốn gọi
Phương thức của lớp Vấn đề này gặp khi chúng ta muốn gọi phương thức khởi tạo của
Cách giải quyết: sử dụng hàm
Tuy nhiên cách này lại dẫn đến vấn đề sau Phương thức khởi tạo của
Mỗi lớp đều cần một tham số khác nhau khi khởi tạo nên theo thứ tự MRO biết trước, chúng ta có thể viết code như trên. Tuy code chạy đúng như ý muốn nhưng mình tin chẳng ai muốn code như trên vì các lí do sau:
Cách giải quyết: sử dụng
Code vẫn trả về kết quả như ý nhưng gọn hơn và dễ bảo trì, mở rộng hơn! Chúng ta vẫn có thể giải quyết trường hợp này bằng cách gọi phương thức khởi tạo trực tiếp nếu bạn đảm bảo không bị ghi đè cho lớp 5. Kết bàiQua bài này mình đã trình bày với các bạn:
Nếu bài viết có chỗ nào không rõ hoặc sai thì xin hãy cho mình biết. Cảm ơn các bạn đã dành thời gian đọc bài viết này! 6. Tham khảo
|