Menu
CoddyTech

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):
    pass

Kiể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 A

Python 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 B

Bâ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.

challenge icon

Thử thách

Trung bình

Trong 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ở Device
  • screen.py: Triển khai lớp Screen kế thừa từ Device
  • computer.py: Triển khai lớp Computer kế thừa từ Device
  • laptop.py: Triển khai lớp Laptop với tính kế thừa đa lớp
  • driver.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
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Python online