Ở bài học trước chúng ta đã cùng tìm hiểu về Kế thừa trong lập trình hướng đối tượng của ngôn ngữ Python. Kế thừa cho phép chúng ta khai báo lớp mới sử dụng lại các hàm và thuộc tính của lớp cha cùng các chức năng mở rộng thêm. Trong bài viết này, Tin học của em sẽ tiếp tục bài học cùng chủ đề Kế thừa nhưng ở mức độ sâu sắc hơn, đó là Đa kế thừa và thứ tự truy xuất phương thức của các lớp cha (Method Resolution Order).

Đa kế thừa (Multiple Inheritance)

Giống như C++ thì trong Python một lớp có thể được định nghĩa từ nhiều lớp cha. Điều này được gọi là đa kế thừa.

Cú pháp:

class LopCha1:
     pass

class LopCha2:
     pass

class LopCon(LopCha1, LopCha2):
     pass

Lớp con đươc định nghĩa từ nhiều lớp cha và kế thừa đặc tính của cả hai lớp.

Các lớp cha có thể có các thuộc tính hoặc các phương thức giống nhau. Lớp con sẽ ưu tiên thừa kế thuộc tính, phương thức của lớp đứng đầu tiên trong danh sách thừa kế.

Kế thừa đa cấp (Multilevel Inheritance)

Ngoài việc có thể kế thừa từ các lớp cha, bạn còn có thể tạo lớp con mới kế thừa các lớp con trước đó. Đây gọi là kế thừa đa cấp (Multilevel Inheritance).

Với trường hợp này, các đặc tính của lớp cha và lớp con trước đó sẽ được lớp con mới kế thừa.

Cú pháp:

class LopCha:
     pass

class LopCon1(LopCha):
     pass

class LopCon2(LopCon1):
     pass

LopCon1 kế thừa LopCha, LopCon2 kế thừa LopCon1.

Thứ tự truy xuất phương thức (Method Resolution Order)

Class được bắt nguồn từ object. Trong kịch bản đa thừa kế, bất kỳ thuộc tính cần được truy xuất nào, đầu tiên sẽ được tìm kiếm trong lớp hiện tại. Nếu không tìm thấy, tìm kiếm tiếp tục vào lớp cha đầu tiên và từ trái qua phải.

Vậy thứ tự truy xuất sẽ là [LopCon, LopCha1, LopCha2, object].

Thứ tự này còn được gọi là tuyến tính hóa của LopCon và tập hợp các quy tắc được sử dụng để tìm thứ tự này được gọi là Thứ tự truy xuất phương thức (MRO).

Nói một cách dễ hiểu, MRO dùng để hiển thị danh sách/tuple các class cha của một class nào đó.

MRO được sử dụng theo hai cách:

  • __mro__: trả về một tuple
  • mro(): trả về một danh sách.
>>> LopCon.__mro__
(<class '__main__.LopCon'>,
 <class '__main__.LopCha1'>,
 <class '__main__.LopCha2'>,
 <class 'object'>)

>>> LopCon.mro()
[<class '__main__.LopCon>,
 <class '__main__.LopCha1'>,
 <class '__main__.LopCha2'>,
 <class 'object'>]

Dưới đây là một ví dụ thừa kế phức tạp và hiển thị trực quan của nó cùng với MRO.

class X: pass
class Y: pass
class Z: pass

class A(X,Y): pass
class B(Y,Z): pass

class M(B,A,Z): pass

# Output:
# [<class '__main__.M'>, <class '__main__.B'>,
# <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.Z'>,
# <class 'object'>]

86 BÌNH LUẬN

  1. Good day! This post couldn’t be written any better!
    Reading through this post reminds me of my old room mate!
    He always kept talking about this. I will forward this post to him.
    Pretty sure he will have a good read. Thanks for
    sharing!

  2. Hey very cool site!! Man .. Excellent .. Wonderful ..
    I will bookmark your site and take the feeds additionally?
    I’m satisfied to seek out a lot of useful information right here within the submit, we need develop
    extra techniques in this regard, thanks for sharing.
    . . . . .

  3. Amazing blog! Is your theme custom made or did you download it from somewhere?
    A design like yours with a few simple adjustements would really make my blog shine.
    Please let me know where you got your theme. Many thanks

  4. Good day! I know this is kinda off topic but I’d figured I’d ask.
    Would you be interested in exchanging links or maybe guest writing a
    blog post or vice-versa? My website covers a lot
    of the same subjects as yours and I feel we could greatly benefit from each other.
    If you happen to be interested feel free to shoot me an e-mail.

    I look forward to hearing from you! Superb blog by the way!

  5. I like the helpful information you provide in your articles.
    I’ll bookmark your weblog and check again here frequently.
    I’m quite sure I’ll learn many new stuff right here! Best of luck
    for the next!

  6. I’ve been surfing online more than three hours today,
    yet I never found any interesting article like yours.
    It is pretty worth enough for me. In my opinion, if all web owners and bloggers
    made good content as you did, the internet will be much more
    useful than ever before.

  7. It’s truly a great and useful piece of info.
    I’m glad that you simply shared this helpful info with us.
    Please stay us informed like this. Thank you for sharing.

  8. We stumbled over here different web page and thought
    I should check things out. I like what I see so i am just following you.
    Look forward to looking at your web page for a second time.

  9. We’re a group of volunteers and opening a new scheme
    in our community. Your web site provided us with
    valuable info to work on. You’ve done a formidable job and
    our whole community will be grateful to you.

  10. Hmm it appears like your blog ate my first comment (it was extremely long) so I guess I’ll just sum it up what I wrote and say, I’m thoroughly enjoying your blog.
    I too am an aspiring blog writer but I’m still new to the whole
    thing. Do you have any recommendations for novice blog
    writers? I’d really appreciate it.

  11. Thanks for a marvelous posting! I truly enjoyed reading it, you can be a great author.
    I will make sure to bookmark your blog and may come back down the road.
    I want to encourage continue your great writing,
    have a nice morning!

  12. Great post but I was wondering if you could write a litte more on this subject?
    I’d be very thankful if you could elaborate a little bit
    more. Bless you!

  13. I simply could not depart your web site before suggesting that I actually enjoyed the standard info an individual supply in your visitors? Is gonna be again continuously in order to inspect new posts

  14. Aw, this was an extremely good post. Taking the time and actual effort to create a superb articleÖ but what can I sayÖ I put things off a whole lot and don’t manage to get anything done.

  15. You are so interesting! I don’t suppose I have read through something like that before. So great to find another person with some genuine thoughts on this subject. Really.. thank you for starting this up. This web site is something that is required on the web, someone with a bit of originality!

  16. When I originally left a comment I appear to have clicked on the -Notify me when new comments are added- checkbox and now each time a comment is added I receive 4 emails with the same comment. Perhaps there is an easy method you can remove me from that service? Thanks!

  17. An impressive share! I’ve just forwarded this onto a co-worker who was conducting a little homework on this. And he in fact ordered me dinner due to the fact that I found it for him… lol. So allow me to reword this…. Thank YOU for the meal!! But yeah, thanx for spending time to discuss this topic here on your site.

THOÁT KHỎI BÌNH LUẬN

Please enter your comment!
Please enter your name here