Python Academy · Ders

Çoklu Kalıtım ve MRO

Çoklu kalıtımı ve Python'ın MRO'sunu (C3 doğrusallaştırması) öğrenin.

3. ders / 414 adım

Çoklu Kalıtım ve MRO, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.

Giriş

Python, birden çok kalıtımı destekler. Yöntem Çözümleme Sırası (MRO), adlar çakıştığında hangi yöntemin çağrılacağını belirler.

Birden Çok Kalıtım Söz Dizimi

class C(A, B): hem A hem de B'den kalıtım alır. C, her iki sınıftaki tüm yöntemleri alır.
class A:
    def hello(self): return 'A'
class B:
    def world(self): return 'B'
class C(A, B): pass
c = C()
print(c.hello(), c.world())

Yöntem Çözümleme Sırası (MRO)

MRO, arama sırasını belirler. C.__mro__, sırayı gösterir: C, A, B, object. Eşleşen yönteme sahip ilk sınıf kazanır.
class A:
    def greet(self): return 'A'
class B:
    def greet(self): return 'B'
class C(A, B): pass
print(C().greet())  # A wins
print(C.__mro__)

C3 Doğrusallaştırması

Python, MRO'yu hesaplamak için C3 doğrusallaştırmasını kullanır. Şunları garanti eder: alt sınıf üst sınıftan önce gelir, birden çok temel sınıf için soldan sağa ilerlenir.
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass
print([c.__name__ for c in D.__mro__])

Elmas Kalıtımı

D(B,C), B ve C'nin her ikisinin de A'dan kalıtım aldığı elmas problemidir. C3, A'nın __init__ yönteminin yalnızca bir kez çağrılmasını sağlar.
class A:
    def __init__(self): print('A')
class B(A):
    def __init__(self): super().__init__(); print('B')
class C(A):
    def __init__(self): super().__init__(); print('C')
class D(B, C):
    def __init__(self): super().__init__(); print('D')
D()

Karışımlar

Karışım, birden çok kalıtım için tasarlanmış bir sınıftır. Tek başına tam bir sınıf olarak kullanılmadan yöntemler ekler.
class JSONMixin:
    def to_json(self):
        import json
        return json.dumps(vars(self))
class User(JSONMixin):
    def __init__(self, name, age): self.name,self.age=name,age
print(User('Alice', 30).to_json())

Karışım Tasarım Kuralları

Karışımlar şunları yapmalıdır: __init__ içermemeli, karışım olmayan sınıflardan kalıtım almamalı ve tek bir iş yapmalıdır. Adlarını Mixin son ekiyle oluşturun.
class LoggingMixin:
    def log(self, msg): print(f'[{self.__class__.__name__}] {msg}')
class Service(LoggingMixin):
    def run(self): self.log('running')
Service().run()

Birden Çok Kalıtımda super()

super(), doğrudan üst sınıf olmak zorunda olmayan, MRO'daki sonraki sınıfı çağırır. İş birlikçi davranış için her sınıf super() çağrısı yapmalıdır.
class Base:
    def action(self): return 'Base'
class A(Base):
    def action(self): return 'A->' + super().action()
class B(Base):
    def action(self): return 'B->' + super().action()
class C(A, B):
    def action(self): return 'C->' + super().action()
print(C().action())

Dinamik Sınıf Oluşturma için type()

type('NewClass', (Base,), {'method': fn}), dinamik olarak bir sınıf oluşturur. Üst veri programlama için kullanışlıdır.
def hello(self): return 'hello'
MyClass = type('MyClass', (object,), {'hello': hello})
print(MyClass().hello())

MRO'yu Denetleme

ClassName.__mro__ veya inspect.getmro(ClassName), çözümleme sırasını sınıflardan oluşan bir demet olarak gösterir.
class A: pass
class B(A): pass
class C(B): pass
import inspect
print([c.__name__ for c in inspect.getmro(C)])

Birden Çok Kalıtımdan Ne Zaman Kaçınılmalı

Karmaşık birden çok kalıtım hiyerarşilerini anlamlandırmak zordur. Derin hiyerarşiler yerine bileşimi veya basit karışımları tercih edin.
# Prefer:
class User:
    def __init__(self, name, logger):
        self.name = name
        self.logger = logger  # composition
print('composition preferred')

Hızlı Yoklama

Python, Yöntem Çözümleme Sırası'nı hesaplamak için hangi algoritmayı kullanır?

Özet

Çoklu kalıtım: class C(A, B). MRO, yöntem aramasını C3 lineerleştirmesiyle belirler. Temiz bir çoklu kalıtım için mixin'leri kullanın. super() MRO'yu izler.

Devam Edin

Mükemmel ilerliyorsunuz! Bir sonraki kavramda ustalaşmak için devam edin.
Başlamak ücretsiz

Yapay zeka eğitmeniyle Python öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
76
Dersler
320

Sıkça Sorulan Sorular

“Çoklu Kalıtım ve MRO” dersi ücretsiz mi?

Evet — “Çoklu Kalıtım ve MRO” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.

“Çoklu Kalıtım ve MRO” dersinde ne öğreneceğim?

Çoklu kalıtımı ve Python'ın MRO'sunu (C3 doğrusallaştırması) öğrenin. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Python Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Çoklu Kalıtım ve MRO” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Tekli Kalıtım
  2. Yöntem Geçersiz Kılma ve super()
  3. Çoklu Kalıtım ve MRO
  4. Çok Biçimlilik ve Ördek Tiplemesi
← Python Academy Sayfasına Dön