การสืบทอดจากคลาสหลายคลาส
คลาสนั้นสามารถสืบทอดคุณลักษณะจากคลาสต้นแบบได้พร้อมกันครั้งหลายคลาส โดยจะเรียกว่า 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() )
ผลที่ได้
[, , , , , , ]