@Visionscaper'ın en üstte ne söylediğine eklemek istiyorum :
Third --> First --> object --> Second --> object
Bu durumda yorumlayıcı, nesne sınıfını çoğalttığı için filtrelemez, bunun yerine İkinci bir kafa konumunda görünür ve bir hiyerarşi alt kümesinde kuyruk konumunda görünmez. Nesne sadece kuyruk pozisyonlarında görünür ve önceliği belirlemek için C3 algoritmasında güçlü bir pozisyon olarak kabul edilmez.
C, L (C) sınıfının doğrusallaştırılması (mro),
- C Sınıfı
- artı birleşmesi
- ebeveynlerinin doğrusallaştırılması P1, P2, .. = L (P1, P2, ...) ve
- ebeveynlerinin listesi P1, P2, ..
Doğrusallaştırılmış Birleştirme, sipariş önemli olduğundan kuyrukların değil listelerin başı olarak görünen ortak sınıflar seçilerek yapılır (aşağıda açıklığa kavuşacaktır)
Üçüncü Doğrusallaştırma aşağıdaki gibi hesaplanabilir:
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]
Bu nedenle, aşağıdaki kodda bir super () uygulaması için:
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"
bu yöntemin nasıl çözüleceği belli oluyor
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()
herhangi bir kullanımın olduğu tek durumdur . Ben sadece işe yaramaz yükü, doğrusal kalıtım kullanarak sınıfları ile kullanmanızı tavsiye etmem.