logo

Python'da Yöntem Çözümleme Sırası

Bu derste MRO olarak da bilinen yöntem çözümleme sırasını öğreneceğiz. Python mirasının önemli bir kavramıdır.

Yöntem çözümleme sırası, sınıfın arama yolunu açıklar. Python Çoklu kalıtımı içeren sınıflarda uygun yöntemi elde etmek için kullanır.

giriiş

Bildiğimiz gibi, miras alınan sınıfa Alt Sınıf veya Ana sınıf, miras alan sınıfa ise çocuk sınıf veya alt sınıf denir. Çoklu kalıtımda, bir sınıf birçok fonksiyondan oluşabilir, bu nedenle temel sınıfın yürütüldüğü sırayı aramak için yöntem çözümleme sırası tekniği kullanılır.

Basit bir ifadeyle - 'Yöntem veya nitelikler geçerli sınıfta araştırılır; yöntem geçerli sınıfta mevcut değilse, arama üst sınıflara taşınır vb.'. Bu, derinlik öncelikli aramaya bir örnektir.

Aynı yöntemin birden fazla üst sınıfta bulunabildiği çoklu kalıtımda önemli bir rol oynar.

Daha iyi anlamak için nasıl kullanabileceğimize bakalım.

Örnek -

 class A: def myname(self): print('I am a class A') class B(A): def myname(self): print('I am a class B') class C(A): def myname(self): print('I am a class C') c = C() print(c.myname()) 

Çıktı:

 I am a class C 

Açıklama -

Zeenat Aman aktör

Yukarıdaki kodda çoklu kalıtım var. A, B ve C adında üç sınıf tanımladık ve bu sınıflar, yöntem adı verilen aynı isme sahip. benim adım(). Bir nesne sınıfı C oluşturduk. Nesne, sınıfı değil C sınıfını çağırdı, C sınıfı ise A sınıfı yöntemini miras aldı.

Yukarıdaki kodda sıra takip edilir: B sınıfı -> A sınıfı. Bu tekniğe MRO (yöntem çözümleme sırası) adı verilir.

Çoklu kalıtımın başka bir örneğini anlayalım.

Örnek -

 class A: def myname(self): print(' I am a class A') class B(A): def myname(self): print(' I am a class B') class C(A): def myname(self): print('I am a class C') # classes ordering class D(B, C): pass d = D() d.myname() 

Çıktı:

 I am a class B 

Açıklama -

'prim'in algoritması'

Yukarıdaki kodda, B ve C sınıfından miras kalan sınıf niteliklerini tanımlamadan başka bir D sınıfı oluşturduk. Yöntemi çağırdığımızda benim adım(), D sınıfına gider ve şunu arar: benim adım( ) işlev. Ancak D sınıfının herhangi bir beyanı yoktur. Dolayısıyla arama B sınıfına aktarılır, benim adım() işlevi çalıştırır ve sonucu döndürür. Arama şu şekilde gerçekleşecektir.

 Class D -> Class B -> Class C -> Class A 

B sınıfının bir yöntemi yoksa, C sınıfı yöntemini çağıracaktır.

Burada B sınıfı metodunu kaldırıp ne olduğunu kontrol etmenizi öneriyoruz. Bunu yaparak, yöntem çözümlemesinin nasıl çalıştığına dair bir fikir edineceksiniz.

Eski ve Yeni Stil Sıralaması

Python'un eski sürümünde (2.1), eski sınıfları kullanmamız sınırlıdır ancak Python (2.2 & devamı), yeni sınıfları kullanabiliriz. Varsayılan olarak Python 3'te orijinal (yeni) sınıflar bulunur. Yeni stil sınıfının ilk ebeveyni Python'un kök 'object' sınıfından miras alır. Aşağıdaki örneğe bakalım -

Örnek -

 # Old style class class OldStyleClass: pass # New style class class NewStyleClass(object): pass 

Her iki sınıfın bildirim stili farklıdır. Yöntem çözümlemesinde, eski stil sınıflar derinlik öncelikli soldan sağa algoritmayı (DLR) takip ederken, yeni stil sınıfları çoklu kalıtım gerçekleştirirken C3 Doğrusallaştırma algoritmasını kullanır.

DLR Algoritması

Python, sınıflar arasındaki çoklu kalıtımı uygularken bir sınıf listesi oluşturur. Bu liste, örnekler tarafından hangi yöntemin çağrılması gerektiğini belirlemek için kullanılır.

Yöntem çözümlemesinin önce derinlemesine arama yapacağı ve ardından soldan sağa gideceği için adıyla çalışmanın olduğunu varsayabiliriz. Aşağıda örnek bulunmaktadır.

Örnek -

 class A: pass class B: pass class C(A, B): pass class D(B, A): pass class E(C,D): pass 

İlk olarak algoritma, çağrılan yöntemi örnek sınıfta arayacaktır. Bulunmazsa ilk veliye, bulunamazsa da ilk veliye gider. Ebeveynin ebeveynine bakacak. Bu, miras sınıflarının sonuna kadar devam edecektir.

Java sıralama dizisi

Yukarıdaki örnekte yöntem çözümleme sırası şu şekilde olacaktır:

 class D -> class B -> class A -> class C -> class A 

Ancak A iki kez mevcut olamaz yani -

 class D -> class B -> class A -> class C -> 

Bu algoritma o zamanki garip davranışları gösteriyor. Aşağıdaki örneği görelim.

Örnek -

 class A: pass class B: pass class C(A, B): pass class D(B, A): pass class E(C,D): pass 

DLR Algoritmasına göre sıralama E, C, D, B, A şeklinde olacaktır. C sınıfında A ve B sınıflarının değişimi vardır ve bu çok belirsizdir. Bu, algoritmanın monotonluk özelliğini korumadığı anlamına gelir.

Samuele Perdoni, MRO algoritmaları arasında bir tutarsızlık keşfeden ilk kişiydi.

C3 Doğrusallaştırma Algoritması

C3 Doğrusallaştırma Algoritması tutarsızlığı ortadan kaldırdığı için DLR algoritmasının daha iyi bir versiyonudur. Bu algoritmanın aşağıda verilen bazı kısıtlamaları vardır.

  • Çocuklar ebeveynlerinden önce gelmelidir.
  • Belirli bir sınıf bir veya daha fazla sınıftan miras alırsa, bunlar temel sınıfın tuple'ında belirtilen sıraya göre kaydedilir.

C3 Doğrusallaştırma Algoritmasının Kuralları

  • Yöntem çözümleme sırasının yapısı miras grafiğiyle tanımlanır.
  • Kullanıcının süper sınıfı ancak yerel sınıfların yöntemleri ziyaret edildikten sonra ziyaret etmesi gerekir.
  • Monotonluğu Koruyun

Yöntem Çözünürlüğü sınıfı için Yöntem

Python bir sınıfın yöntem çözümleme sırasını almanın iki yolunu sunar - __mro__ özellik veya mro() yöntem. Bu yöntemlerin yardımıyla çözümlendikleri yöntemin sırasını görüntüleyebiliriz.

Aşağıdaki örneği anlayalım.

Örnek -

 class A: def myname(self): print(' I am a class A') class B(A): def myname(self): print(' I am a class B') class C(A): def myname(self): print('I am a class C') # classes ordering class D(B, C): pass # it prints the lookup order print(D.__mro__) print(C.mro()) 

Çıktı:

 (, , , , ) [, , ] 

Yukarıdaki çıktıda da görebileceğimiz gibi, yöntem çözümleme sırasının sırasını alıyoruz. Bu şekilde C3 doğrusallaştırma algoritması çoklu kalıtım için çalışmaktadır.