30/09/2018, 22:20

Hỏi về đa kế thừa (Multiple inheritance) trong python

mình học đến bài 44 ở quyển learnpythonthehardway và mình test đoạn code:

class Parent(object):
	def print_out(self):
		print "PARENT!"

class Child(object):
	def print_out(self):
		print "CHILD!"

class SuperFun(Child, Parent):
	def print_out(self):
		super(SuperFun, self).print_out()

s = SuperFun()
s.print_out()

kết quả:

CHILD!

class SuperFun kế thừa 2 class Child và Parent
mình muốn hỏi là sau khi dùng phương thức super(...) thí khi dùng s.print_out() nó sẽ gọi đến print_out() của class đứng trước trong khai báo class SuperFun(Child, Parent). Ở đây là Child

vậy mình muốn gọi đến cái print_out() của Parent thì làm thế nào

viết 00:34 ngày 01/10/2018

Parent.print_out(self)

Nguyen Ca viết 00:35 ngày 01/10/2018

Thế vấn đề diamond problem trong đa kế thừa, Python giải quyết sao ta.

LE Manh Cuong viết 00:26 ngày 01/10/2018

Python sử dụng thuật toán C3 để xác định method resolution order (MRO) để xây dựng một bản đố kế thừa.

Gọi cls.mro() method để biết mro của một class:

print SuperFun.mro()

Chi tiết thuật toán C3 có thể xem tại đây. Cơ bản thì thuật toán C3 đảm bảo 2 điều:

  • Lớp con sẽ xuất hiện trước lớp cha
  • Thứ tự định nghĩa các lớp cha được bảo toàn

Đối với tất cả các lớp trong bản đồ kế thừa thì 2 điều trên luôn đúng.

Hoài Nam viết 00:23 ngày 01/10/2018

vậy mình muốn gọi đến cái print_out() của Parent qua SuperFun thì làm thế nào ạ

LE Manh Cuong viết 00:28 ngày 01/10/2018
Parent.print_out(self)
Hoài Nam viết 00:33 ngày 01/10/2018

ý e là SuperFun cũng là con của lớp Parent thì có cách nào để gọi đến phương thức của lớp cha đó thông qua lớp con không ấy

LE Manh Cuong viết 00:31 ngày 01/10/2018

Như trên đó, gọi như vậy trong SuperFun.print_out.

Bạn đọc bài trên của mình thì thấy, thứ tự khai báo lớp cha được bảo toàn, nên Child bao giờ cũng xuất hiện trước Parent trong mro của SuperFun, nên khi gọi super(SuperFun, self).print_out() thì luôn gọi method của Child trước.

Hoài Nam viết 00:24 ngày 01/10/2018

e cảm ơn

patrick viết 00:27 ngày 01/10/2018

Mình thấy chỉ cần đổi Class SuperFun(Parent, Child):
là được mà

Bài liên quan
0