Thứ tự phân giải phương thức
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 21 trên 64.
Thứ tự phân giải phương thức (Method Resolution Order, MRO) là trình tự Python dùng để tìm phương thức khi nhiều lớp có cùng tên phương thức.
Đây là ví dụ về nhiều lớp có cùng một phương thức:
class A:
def method(self):
return "Method from A"
class B:
def method(self):
return "Method from B"
class C(A, B):
passKiểm tra MRO bằng __mro__:
print(C.__mro__)Đầu ra:
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)Thuộc tính __mro__ là một tuple chứa tất cả các lớp theo thứ tự phân giải. Phần tử đầu tiên (__mro__[0]) luôn là chính lớp đó (C), tiếp theo là các lớp cha từ trái sang phải (A, rồi đến B), cuối cùng là lớp object tích hợp sẵn.
Tạo một đối tượng và gọi phương thức:
c = C()
print(c.method())Đầu ra:
Method from APython tìm thấy phương thức trong lớp A trước (ở chỉ số 1 trong MRO), nên đã dùng phương thức đó.
Thay đổi thứ tự kế thừa để thấy sự khác biệt:
class D(B, A): # B đứng trước A rồi
pass
print(D.__mro__)
d = D()
print(d.method())Đầu ra:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Method from BBây giờ, Python tìm phương thức của B trước vì B đứng trước A trong danh sách kế thừa. Bạn có thể truy cập các lớp cụ thể trong MRO bằng cách dùng chỉ số: D.__mro__[0] chính là D, D.__mro__[1] là B và D.__mro__[2] là A.
Bạn cũng có thể dùng phương thức mro():
print(C.mro())Mặc dù mro() và __mro__ cung cấp cùng một chuỗi lớp, chúng khác nhau về kiểu dữ liệu: __mro__ trả về một tuple, còn mro() trả về một danh sách.
Điểm chính: Python tìm phương thức theo thứ tự MRO: trước tiên là chính lớp đó (chỉ số 0), sau đó là các lớp cha từ trái sang phải như được liệt kê trong định nghĩa lớp (chỉ số 1, 2, v.v.). Phương thức đầu tiên được tìm thấy sẽ được dùng.
Thử thách
Trung bìnhTrong thử thách này, bạn sẽ triển khai một hệ thống phân cấp lớp.
Bạn cần chỉnh sửa các tệp sau:
device.py: Triển khai lớp cơ sởDevicescreen.py: Triển khai lớpScreenkế thừa từDevicecomputer.py: Triển khai lớpComputerkế thừa từDevicelaptop.py: Triển khai lớpLaptopvới tính kế thừa đa lớpdriver.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 từng bước triển khai.
Tự làm thử
# TODO: Import tất cả các lớp cần thiết
# from device import Device
# from screen import Screen
# from computer import Computer
# from laptop import Laptop
def explain_mro(class_name):
# TODO: In ra MRO (thứ tự phân giải phương thức) của lớp đã cho
# TODO: Định dạng: "MRO for [class name]:" (lưu ý: KHÔNG có dấu cách sau dấu hai chấm)
# TODO: Dùng class_name.__name__ để lấy tên lớp
# TODO: Dùng class_name.__mro__ để lấy tuple MRO
# TODO: In tên từng lớp trong MRO trên một dòng riêng
# TODO: Tạo một instance của lớp
# TODO: Gọi power_on() trên instance và lưu kết quả
# TODO: In ra: "Power on result: [result]"
# TODO: In ra một dòng trống để dễ đọc hơn
pass
# Kiểm tra code của bạn
# TODO: Gọi explain_mro() với từng lớp: Device, Screen, Computer và Laptop
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
1Nền tảng về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTham số selfPhương thứcThuộc tínhPhương thức khởi tạo (__init__)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnHàm super()Ghi đè phương thứcKế thừa đa lớpThứ tự phân giải phương thứcÔn tập: hệ thống phân cấp nhân viên2Decorator
Giới thiệu về decoratorDecorator thuộc tínhDecorator phương thức tĩnhDecorator phương thức lớp5Tính đa hình
Xem lại cách ghi đè phương thứcKiểu gõ vịtLớp và phương thức trừu tượngThiết kế giao diệnÔn tập: máy tính hình học8Các khái niệm OOP nâng cao
Kết hợp và kế thừaMixinPhương thức tĩnh và phương thức lớpDecorator lớpTrình quản lý ngữ cảnhTự luyện tập: Trình biên dịch Python online