SORU
18 Temmuz 2010, Pazar


Nasıl Python'In super() çoklu kalıtım ile çalışmak?

Nesne tabanlı programlama Python ve sorun var çok yeniyim super() anlama birden çok devralma konusunda özellikle fonksiyon (yeni stil sınıfları).

Eğer varsa, örneğin gibi bir şey

class First(object):
    def __init__(self):
        print "first"

class Second(object):
    def __init__(self):
        print "second"

class Third(First, Second):
    def __init__(self):
        super(Third, self).__init__()
        print "that's it"

Olduğunu anlamadığım: Third() sınıf her iki yöntem de yapıcı miras mı kalacak? Evet, O süper ile çalışacak olan) ve neden?

Ve eğer başka bir çalıştırmak için ne yapmalı? Python yöntemi ile ilgili bir şey olduğunu biliyorum çözünürlük için (MRO).

CEVAP
18 Temmuz 2010, Pazar


Bu http://python-history.blogspot.com/2010/06/method-resolution-order.html Guido kendini (iki önceki girişimleri de dahil olmak üzere) tarafından ayrıntılı makul bir süre ile ayrıntılı.

Ama, kısaca: örnek, Üçüncü () First.__init__ arayacak. Böyle basit durumlar için, Python sınıf ailesi, sağa sola özniteliği (bu durumda, __init__) arar. Sen tanımlarsanız yani

class Third(First, Second):
    ...

Python İkinci en başta, ve eğer İlk özniteliği yok eğer değil mi, bakacağız.

Bu durum kalıtım yolları (Eğer İlk andan itibaren miras eğer ki, mesela) geçiş başladığında daha karmaşık hale gelir. Okuma linki daha fazla bilgi için yukarıda ama, özetle, Python her sınıf mirası listesinde, alt sınıflar ilk göründüğü sırayı korumak için çalışacağız.

Eğer olsaydı yani, örneğin,:

class First(object):
    def __init__(self):
        print "first"

class Second(First):
    def __init__(self):
        print "second"

class Third(First):
    def __init__(self):
        print "third"

class Fourth(Second, Third):
    def __init__(self):
        super(Fourth, self).__init__()
        print "that's it"

MRO [Fourth, Second, Third, First]. olurdu

Bu arada: Python olamaz tutarlı yöntem çözünürlüklü bir düzen bulmak, bir istisna, kullanıcı sürpriz olabilecek bir davranış düşen geri yerine kaldırın.

Düzenlenmiş belirsiz bir MODİFİKASYON örneği eklemek için:

class First(object):
    def __init__(self):
        print "first"

class Second(First):
    def __init__(self):
        print "second"

class Third(First, Second):
    def __init__(self):
        print "third"

Üçüncü MRO [First, Second] [**16 yaşında olmalı? Belirgin bir beklenti yok, ve Python hata neden olur:

Eğer data: çağrılırken Hata metaclass üsleri Olamaz üsleri için tutarlı bir yöntem çözünürlük emri (BAKIM) oluşturmak İkinci, Birinci

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Martin

    Caroline Mar

    19 EYLÜL 2008
  • geraldnonadoez

    geraldnonado

    3 Temmuz 2013
  • Justin Schenck

    Justin Schen

    24 Kasım 2006