2013-04-09 16 views
14

düşünüldüğünde: Python 2.7 olarakPython super() kalıtım ve gerekli argümanlar

class Parent(object): 

    def altered(self): 
     print "PARENT altered()" 

class Child(Parent): 

    def altered(self): 
     print "CHILD, BEFORE PARENT altered()" 
     super(Child, self).altered() # what are the arguments needed? Why Child and self? 
     print "CHILD, AFTER PARENT altered()" 

, Neden Childsuper() çağrısına bağımsız değişken olarak geçmiş olması gerekir? Çalışmasına izin vermek yerine, süper kullanmanın kesin incelikleri nelerdir? Metot Çözünürlüğü Sırasındaki sonraki sınıfın hangisi olduğunu

+7

Bildiğim kadarıyla MRO ile ilgili. Ama "gerçek" bir cevap için açıklamakta yeterince iyi değilim. Belki bu yardımcı olur: http://rhettinger.wordpress.com/2011/05/26/super-considered-super/ Python 3'te artık argümanlara ihtiyaç duyulmadığını unutmayın. –

+0

İlk argüman "Çocuk" olmaktır Ebeveynin üssü olduğundan beri miras almak istediğiniz sınıfta değil, sınıftasınız? Sanırım böyle bir şey. Ayrıca okuma için teşekkürler ve açık olmak için Python 2.7 kullanıyorum. Super() –

cevap

18

super. Aktardığınız iki argüman, bunu anlatabilmemizdir - self, bir MRO değerini bir özellik aracılığıyla verir; Geçerli sınıf, şu anda MRO şu an nerede olduğunuzu söyler. Peki süper aslında yapıyor temelde:

def super(cls, inst): 
    mro = inst.__class__.mro() # Always the most derived class 
    return mro[mro.index(cls) + 1] 

öyle nedeni süper sahip tüm noktası çalışır bir işlevi var çünkü şu anki sınıf taban sınıfların ziyade temel sınıf olduğunu ziyade neyi açık bir şekilde başvurmaktan daha fazlası - temel sınıfın adı değiştiğinde sorunlara neden olabilir, eğer ana sınıfın tam olarak ne olduğunu bilmiyorsanız (yeni bir sınıf çıkartan namedtuple gibi fabrika işlevlerini düşünün) Çok-devralma durumlarında (MRO'daki bir sonraki sınıfın mevcut sınıf 'üslerinden biri olmaması).

+0

hakkında okumaya devam edeceğim Temel sınıftan ziyade sınıfın geçerli olmasının sebebi, süper olmanın tüm noktasının, bu temel sınıfın açık bir şekilde kendisine başvurmaktan ziyade ne işe yaradığını gösteren bir işleve sahip olmasıdır. . Bahsettiğin hattın güzelce özetlendiğini düşünüyorum. MRO'ya bakacağım ve python 3'ün bu argümanları gerektirmediğinden bunun sadece bir python 2.x'in bir parçası olduğunu anlayacağım. Teşekkür ederim. –

+3

Klandshome Python 3'ün süper çalışması da tam olarak aynı şekilde çalışır - sadece birçok koşulda (çağrı yığınının denetlenmesiyle) kendi argümanlarını çözebilmek için bazı ilginç büyütmeler vardır. – lvc

+1

Hmm. Büyük bilgi. Çağrı yığını. Çok şey öğrendim. Teşekkür ederim. –