*

şükela:  tümü | bugün
  • c3 superclass linearization olarak da bilinen bir algoritma. python ise kullandığı bu algoritmanın ismini mro ya da method resolution order olarak kullanmaktadır. multiple inheritance sırasında oluşabilecek potansiyel diamond problem için kullanılarak miras alınan metotların doğrusallaştırılarak sırayı koyulmasını amaçlamaktadır. prensip olarak depth-first daha sonra left-right olarak doğrusallaştırır. nasıl mı?

    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())

    # [<class 'm'>, <class 'b'>, <class 'a'>, <class 'x'>, <class 'y'>, <class 'z'>, <class 'object'>]

    m -> b -> y -> z -> a -> x -> y -> z şeklinde bir beklentimiz vardı. z ve y sınıfı sanki iki kere çağırılmış gibi duruyor. aslında buradaki problem hangi metodun hangi sırayla miras alınacağı ve önceliğe sahip olacağı ile alakalıdır. sınıf hiyerarşisine şu şekilde bakalım ve mro uygulamasının nasıl olduğunu anlayalım:

    - m
    - b, y, z
    - a, x, y
    - z

    ilk olarak m sınıfı çağırılır, sonra sırayla miras alınan sınıflar aramaya dahil edilir. depth-first olduğu için ilk olarak b seçilir daha sonra onun miras aldığı y ve z seçilmez çünkü algoritmamız depth-first öncelikliydi bu sebeple arama işlemi devam eder ve a sınıfı seçilir. aramanın bir sonraki adımına ait olan z sınıfının superclassobject olduğundan left-right seçimi gerçekleşmelidir. bu sebeple bir adım öncesine gidilir; x ve y sınıfları ardından z sınıfı seçilir. en son adım olarak da superclass'ın miras aldığı object seçilir. böylece doğrusallaştırma işlemi tamamlanır.

    sonradan gelen edit: python'da diamond problem çözümü olarak sunulan super() kullanımı aslında superclass'ın metodunu değil sıradaki (mro ile oluşturulan sıraya göre) çalışıtırılacak olan metodu çağırır.