Python super() ile __init__() yöntemlerini anlama

Super()` kullanımını anlamaya çalışıyorum. Görünüşe göre, her iki alt sınıf da gayet iyi bir şekilde oluşturulabilir.

Aşağıdaki 2 çocuk sınıfı arasındaki gerçek farkı merak ediyorum.

class Base(object):
    def __init__(self):
        print "Base created"

class ChildA(Base):
    def __init__(self):
        Base.__init__(self)

class ChildB(Base):
    def __init__(self):
        super(ChildB, self).__init__()

ChildA() 
ChildB()
Çözüm

super()`, temel sınıfa açıkça atıfta bulunmaktan kaçınmanızı sağlar, bu da güzel olabilir. Ancak asıl avantaj, her türlü eğlenceli şeyin gerçekleşebileceği çoklu kalıtım ile gelir. Henüz yapmadıysanız super hakkındaki standart dokümanlara bakın.

Python 3.0'da sözdiziminin değiştiğini unutmayın]3: super(ChildB, self).__init__() yerine sadece super().__init__() diyebilirsiniz ki bu IMO'ya göre biraz daha hoştur. Standart dokümanlar ayrıca oldukça açıklayıcı olan bir super() kullanma kılavuzu'na da atıfta bulunmaktadır.

Yorumlar (5)

Sadece bir uyarı... Python 2.7 ile ve sanırım super() 2.2 sürümünde tanıtıldığından beri, yalnızca ebeveynlerden biri sonunda object (new-style classes) miras alan bir sınıftan miras alıyorsa super() çağırabilirsiniz.

Şahsen, python 2.7 kodu için, super() kullanmanın avantajını gerçekten elde edene kadar BaseClassName.__init__(self, args) kullanmaya devam edeceğim.

Yorumlar (2)

Gerçekten yok. super()metotları çağırmak için MROdaki (metot çözümleme sırası, cls.__mro__ ile erişilir) bir sonraki sınıfa bakar. Sadece __init__ tabanını çağırmak, __init__ tabanını çağırır. Olduğu gibi, MRO'da tam olarak bir öğe vardır - temel. Yani aslında tam olarak aynı şeyi yapıyorsunuz, ancak super() ile daha güzel bir şekilde (özellikle daha sonra çoklu kalıtım konusuna girerseniz).

Yorumlar (6)