Kulağa oldukça karmaşık gelen bir konu hakkında konuşalım.
Buna MRO veya yöntem çözümleme emri denir.
Bu ne anlama geliyor?
Burada sizin için bir örnek var.
Diyelim ki A sınıfından miras alan ve hiçbir şey yapmayan bir A sınıfı B sınıfımız var.
Ayrıca yine A'dan miras alan bir C sınıfımız ve son olarak da B ve C'den miras alan bir
D sınıfımız vardır.
Yani hiçbir şey yapmayan iki sınıfımız ve aynı sınıf nesnesi özelliğine sahip
bir A ve C sınıfımız var.
Ve aslında bu ilişkinin nasıl göründüğünü çizdim.
D'nin B ve C'den çoklu kalıtıma sahip olduğunu ve B ve C'nin A'dan kalıtıldığını görüyorsunuz.
Amro ya da metot çözümleme sırası, Python'un karmaşık bir kalıtım yapısına sahip olduğunuzda bir metodu çalıştırdığınızda hangisinin
çalıştırılacağını belirlemek için izlediği bir kuraldır.
Amro, "Hey, şunu yap, bunu yap ve sonra şunu yap" diyen bir kuraldır.
Ve çalıştırmanız gereken yöntem budur.
Size ne demek istediğimi göstereyim.
Diyelim ki dx nokta numarasını yazdırmak istedim.
Sizce burada ne olacak?
Bunu aradan çıkarayım ya da yorumlayayım.
Bunu çalıştırırsam, ne olacağını tahmin edebilir misin?
Çalıştır'a tıklarsam.
Bir tane alabilir miyim?
Beklediğin bu muydu?
Şuna bir göz atalım.
DD, B ve C'den miras alır.
Ve sonra bunlar bana miras kalır.
Bu yüzden bir tane alıyoruz çünkü MRO, yöntem çözümleme sırası D, b, a'ya gitmiyor.
Onun yerine D'ye gidiyor.
B.
C.
A.
Hmm.
Bunu biraz daha düşünelim.
Ve Miro basitçe, sınıflar, yöntemler veya değişkenler ya da nitelikler arasında ortak olan şeyler varsa ilk sırada ne olduğunu
söylüyor?
Ne seçmeliyim?
Ve aslında bunu kontrol etmemizin iyi bir yolu var, Miro, ve sonra bu şekilde çalıştırın.
Sahte göl koşusu.
Şuna bir bak.
Bu sınıfın düzeni ya da Maro'su budur.
Diyor ki, Hey, önce D'yi kontrol edeceğim.
Eğer ararsanız, diyelim ki D nokta adı veya d nokta numarası.
Önce ana nokta D'yi kontrol edeceğim.
Bu yüzden bu sınıfı kontrol edeceğim, sonra ana nokta B'yi kontrol edeceğim, yani B'yi kontrol edeceğim
ve sonra C'yi kontrol edeceğim.
Ve sonra bir kontrol edeceğim.
Ve son olarak, temel sınıf nesnesini tekrar kontrol edeceğim.
Bunu daha önce de gördük.
Python'daki tüm nesnelerin miras aldığı temel sınıftır.
Yani kontrol ettiği sıra budur.
Şimdi, eğer bunların hepsini geçersek.
Ve Çalıştır'a tıklıyorum.
Hava alacağım.
D'nin numb niteliği yoktur çünkü tüm bu yoldan geçmiş, hatta temel nesneyi kontrol etmiş ve num'u asla
bulamamıştır.
SW tr gibi bir şey yapsaydım.
Çalıştır'a tıklarsam.
Bu işe yarar çünkü miras zinciri boyunca ilerler ve ardından temel nesneye ulaşır.
Ve temel nesne aslında buna sahiptir, böylece hata vermez.
Ve evet, dunder ipini kullanabilirsin.
Şimdi.
Burada mirasların neden kafa karıştırıcı olabileceğini ve Amro gibi şeylerden neden kaçınmak ya da en azından bilinçli
olmak isteyebileceğinizi gösteren harika bir örnek buldum.
Şimdi bu kodu kopyalayalım.
Ve tüm bunları kaldıralım.
Ve küçük bir oyun oynayacağız.
Şimdi bu sözdizimi.
Şuna benziyor.
İşte bu, az önce oluşturduğumuz kalıtım modelidir.
Oldukça kafa karıştırıcı görünüyor, değil mi?
Eğer onları burada yaparsak.
Ve MRO'yu veya M'nin yöntem çözümleme sırasını kontrol ederiz.
Sizce sipariş ne olacak?
Videoyu burada durdurun ve sıranın ne olacağını tahmin etmeye çalışın.
Hazır.
Hadi M dot amro yapalım.
Bu arada, bunu yapmanın bir başka yolu da dunder amro kullanmaktır ve bunu yazdıralım.
Pekala, şunu kontrol edelim.
Elimizdeki ilk şey em.
Tamam mı?
Onu kontrol edeceğiz, sonra B'yi kontrol edeceğiz, B'yi kontrol edeceğiz, tamam.
Ve sonra A'yı kontrol ederiz.
Yani burada A'yı kontrol ediyoruz ve sonra burada x x'i kontrol ediyoruz, sonra y'yi.
Sonra Z, sonra da sınıf nesnesi.
Tahmin ettiğin bu muydu?
Koda bakalım.
Neden bu sipariş?
Sıralama, parametreleri geçirme şeklimiz nedeniyle be'nin A ve Z'den önce geçirildiğini görüyorsunuz.
Bu da demek oluyor ki Maro'nun sırası a olacak.
Ama Bina'dan sonra bekle.
Neydi o?
B ve A'dan sonra elimizde X sınıfı var.
X neden Z'den önce geldi?
Z'ye gitmek yerine bunu biraz daha büyütelim.
Z'ye gideceğini düşündüğümüz yere gitmek yerine X'e, sonra Y'ye, sonra Z'ye, sonra da nesneye
gider.
Bunun nedeni, Miro'yu yapmak için kullandıkları ve arama derinliği olarak adlandırılan algoritmadır.
Şimdi bu kursun kapsamı dışında, ancak görebileceğiniz gibi, biraz kafa karıştırıcı.
Ve aslında Python, MISO kurallarını Python'un daha önceki sürümlerinde sahip olduğumuzdan
değiştirdi.
Bu da güncellenen şeylerden bir diğeri.
Ama bunu size göstermemin nedeni, bu konuda asla test edilmeyecek olmanız.
Kalıtımın bu şekilde göründüğü bir kod yazıyorsanız, kötü kod yazdığınızı iddia ediyorum
çünkü bu aşırı karmaşık.
Aslında bu sınıfların içine herhangi bir kod bile yazmadık ve şimdiden kafa karıştırıcı.
Yani Amro, hangi sırayla miras alacağınızı tanımlamanın bir yolu olarak var.
Bunu kontrol etmek için her zaman MRO işlevini veya DUNDAR'ı kullanabilirsiniz.
Ama bunu buraya getirmemin nedeni sadece kafanızı karıştırmak değil.
Bunun nedeni var olmasıdır.
Ancak, kodunuzu bu şekilde yapılandırmamalısınız.
Bu, bunun vahşi doğada gerçekleşmediği anlamına gelmez.
Evet, öyle.
Ancak en azından böyle bir sorun gördüğünüzde kodunuzu kontrol etmenin ve belki de hata ayıklamanın bir yolunu bulmuş olursunuz.
Size Maro hakkında bir kaynak bırakacağım.
Gerçekten merak ediyorsanız ve bu algoritmanın nasıl çalıştığını ve bu sıralamanın gerçekte nasıl belirlendiğini gerçekten
anlamak istiyorsanız.
Ancak temel çıkarım, Python'un bir yöntemi veya niteliği ne zaman çağıracağınızı belirlemek
için bu şekilde çalıştığıdır.
Miras hiyerarşisine bu şekilde bakacağım.
Tamam.
Beyniniz ağrıyorsa endişelenmeyin.
Benimki de öyle.
Biraz ara verin, bir sonraki videoda görüşmek üzere.
Güle güle.