Python – Multiple Inheritance

การสืบทอดจากคลาสหลายคลาส
คลาสนั้นสามารถสืบทอดคุณลักษณะจากคลาสต้นแบบได้พร้อมกันครั้งหลายคลาส โดยจะเรียกว่า multiple inheritance เมื่อทำการสืบทอดมาจากหลายคลาส คุณลักษณะทั้งหมดจากคลาสต้นแบบแต่ละคลาสจะถูกสืบทอดมายังคลาสนั้น
วิธีการใช้งาน

class Base1:
     pass

class Base2:
     pass

class MultiDerived(Base1, Base2):
     pass

โดย multiDervied คลาสจะสืบทอดคุณลักษณะทั้งหมดมาจากทั้งคลาส Base1 และ Base2

การสืบทอดหลายระดับ
เราสามารถทำการสืบทอดคลาสมาจาก คลาสที่ทำการสืบทอดมาจากคลาสอื่นอีกทีได้ ซึ่งเรียกว่า การสืบทอดในหลายระดับ โดยสามารถสืบทอดในรูปแบบนี้ได้ในหลายๆระดับ โดยคุณลักษณะจากคลาสต้นแบบและคลาสที่สืบทอดมาจากคลาสต้นแบบ จะถูกสืบทอดมายังคลาสที่ต้องการสืบทอดคุณลักษณะดังกล่าวทั้งหมด
วิธีการใช้งาน

class Base1:
     pass

class DerviedLevel1(Base):
     pass

class DerivedLevel2(DerivedLevel1):
     pass

จากตัวอย่าง คลาส DerviedLevel1 นั้นสืบทอดมาจากคลาส Base1 จากนั้นคลาส DerivedLevel2 ก็ทำการสืบทอดมาจากคลาส DerviedLevel1 อีกทีหนึ่ง

ลำดับการทำงานของฟังก์ชันสำหรับการสืบทอดคลาส
ทุกๆ คลาสจะสืบทอดมาจากคลาส object ดังนั้นทุกๆคลาส ไม่ว่าจะเป็นคลาสที่มากับไพธอนหรือคลาสที่เขียนขึ้นใหม่นั้น ต่างก็เป็นคลาสสืบทอดและออบเจ็คที่สร้างทั้งหมดก็เป็น instance ของคลาส object ด้วย
ตัวอย่างการใช้งาน

print( issubclass(list, objects) )
# True

print( isinstance(5.5, object) )
# True

print( isinstance("Hello", object) )
# True

สำหรับการสืบทอดจากหลายๆ คลาส คุณลักษณะที่กำหนดจะถูกค้นหาจากภายในคลาสนั้นๆก่อน หากไม่พบ จึงทำการค้นหาต่อในคลาสที่ทำการสืบทอดมา(parent class) ในรูปแบบ depth-first, left-right โดยจะไม่ค้นหาข้อมูลซ็ำในคลาสเดิม

ดังนั้นจากตัวอย่างเรื่อง MultiDerived การค้นหาคุณลักษณะจากคลาสจะเป็นลำดับคือ [MultiDerived, Base1, Base2, object] ลำดับเช่นนี้จะเรียกว่า linearization ของคลาส MultiDerived และกฏสำหรับค้นหาลำดับดังบกล่าวนี้เรียกว่า Method Resoluton Order(MRO)

MRO must prevent local precedence ordering and also provide monotonicity. It ensures that a class always appears before its parents and in case of multiple parents, the order is same as tuple of base classes.

เราสามารถจะดูข้อมูล MRO ของคลาสได้จากคุณลักษณะ __mro__ หรือฟังก์ชัน mro() โดยแบบแรกจะคืนค่าเป็น tuple และแบบหลังจะคืนค่าเป็นลิสต์
ตัวอย่างการใช้งาน

>>> MultiDerived.__mro__
(,
 ,
 ,
 )

>>> MultiDerived.mro()
[,
 ,
 ,
 ]

ตัวอย่างการใช้งานการสืบทอดที่โครงสร้างซับซ้อนและดูข้อมูล 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

print( M.mro() )


ผลที่ได้

[, ,
 , ,
 , ,
 ]