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()
2357
3
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 sadecesuper().__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.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 sonundaobject
(new-style classes) miras alan bir sınıftan miras alıyorsasuper()
çağırabilirsiniz.Şahsen, python 2.7 kodu için,
super()
kullanmanın avantajını gerçekten elde edene kadarBaseClassName.__init__(self, args)
kullanmaya devam edeceğim.Gerçekten yok. super()
metotları çağırmak için MRO
daki (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, ancaksuper()
ile daha güzel bir şekilde (özellikle daha sonra çoklu kalıtım konusuna girerseniz).