ฉันต้องการเพิ่มสิ่งที่ @Visionscaper พูดที่ด้านบน:
Third --> First --> object --> Second --> object
ในกรณีนี้ล่ามจะไม่กรองคลาสของวัตถุเนื่องจากมีการทำซ้ำ แต่เป็นเพราะที่สองปรากฏในตำแหน่งหัวและไม่ปรากฏในตำแหน่งท้ายในส่วนย่อยของลำดับชั้น ในขณะที่วัตถุปรากฏเฉพาะในตำแหน่งหางและไม่ถือว่าเป็นตำแหน่งที่แข็งแกร่งในอัลกอริทึม C3 เพื่อกำหนดลำดับความสำคัญ
linearisation (mro) ของคลาส C, L (C) คือ
- คลาส C
- บวกกับการรวม
- linearisation ของพ่อแม่ P1, P2, .. = L (P1, P2, ... ) และ
- รายการผู้ปกครองของ P1, P2, ..
การผสานเชิงเส้นทำได้โดยการเลือกคลาสทั่วไปที่ปรากฏเป็นส่วนหัวของรายการและไม่ใช่ส่วนท้ายตั้งแต่ลำดับสำคัญ (จะชัดเจนด้านล่าง)
การคำนวณเชิงเส้นที่สามสามารถคำนวณได้ดังนี้:
L(O) := [O] // the linearization(mro) of O(object), because O has no parents
L(First) := [First] + merge(L(O), [O])
= [First] + merge([O], [O])
= [First, O]
// Similarly,
L(Second) := [Second, O]
L(Third) := [Third] + merge(L(First), L(Second), [First, Second])
= [Third] + merge([First, O], [Second, O], [First, Second])
// class First is a good candidate for the first merge step, because it only appears as the head of the first and last lists
// class O is not a good candidate for the next merge step, because it also appears in the tails of list 1 and 2,
= [Third, First] + merge([O], [Second, O], [Second])
// class Second is a good candidate for the second merge step, because it appears as the head of the list 2 and 3
= [Third, First, Second] + merge([O], [O])
= [Third, First, Second, O]
ดังนั้นสำหรับการใช้งาน super () ในรหัสต่อไปนี้:
class First(object):
def __init__(self):
super(First, self).__init__()
print "first"
class Second(object):
def __init__(self):
super(Second, self).__init__()
print "second"
class Third(First, Second):
def __init__(self):
super(Third, self).__init__()
print "that's it"
จะเห็นได้ชัดว่าวิธีนี้จะได้รับการแก้ไขอย่างไร
Third.__init__() ---> First.__init__() ---> Second.__init__() --->
Object.__init__() ---> returns ---> Second.__init__() -
prints "second" - returns ---> First.__init__() -
prints "first" - returns ---> Third.__init__() - prints "that's it"
super()
มีการใช้งานใด ๆ ฉันจะไม่แนะนำให้ใช้กับคลาสที่ใช้การสืบทอดเชิงเส้นซึ่งเป็นค่าใช้จ่ายที่ไร้ประโยชน์