2011-04-12 15 views
19

Super() işlevini çağırmadan önce bazı işlemleri yapmak istediğiniz durumlar var mı?Pitonda, süper() her zaman bir yöntemde ilk olarak adlandırılır. Daha sonra aranması gereken durumlar var mı?

Bu, zor bir örnektir. Daha iyi örnekler var mı? Bu pythonic olarak kabul edilir mi?

class Base(object): 
    def __init__(self, name): 
     print "Base %s created" % name 
     self._name = name 

class UpperBase(A): 
    """ Similar to base but the name is in uppercase. """ 
    def __init__(self, name): 
     name = name.upper() 
     super(UpperBase, self).__init__(name) 
+0

Örneğiniz, * üst sınıf için üst sınıftan önce ek hesaplamalar yaptığınız durum türü *. "Thread" alt sınıflarını tanımlarken sık sık yaptığımı biliyorum - iş parçacığına genellikle yapıcı argümanlarına dayanan anlamlı bir ad vermek için bazı mantık var. – ncoghlan

+0

"super() .." yöntemini çağırmadan önce durum durumunu * değiştirmekten kaçınmalısınız. Öyleyse argümanlarda (dönüştürme, doğrulama, vb.) Bazı hesaplamalar yapmak tamamdır, ancak örneğin durumunu değiştirmemelisiniz. – frans

+0

@frans Neden? (Çok fazla kod gördüm.) – TomOnTime

cevap

22

Bazen super() çağırmadan önce argümanları doğrulamak gerekir: Bu pythonic olmazdı neden bunu yapmak için en kolay yoludur ve basit olduğu için, görmüyorum

class UpperBase(Base): 
    def __init__(self, name): 
     if not name_valid(name): 
      raise ValueError() 
     super(UpperBase, self).__init__(name) 

. Ayrıca, @JHSaunders 'yorumunu oku, iyi bir noktaya işaret ediyor.

+10

Ya, python'daki init yöntemi C++ gibi bir kurucu değildir; fiili bellek tahsisi.Yükleme zamanına göre bellek ayrılır.Bu yüzden, sadece belirli bir semantiğe sahip olan normal bir yöntemdir (Bir nesnenin oluşturulmasından sonra çağrılır) Yani kısaca, onu arayabilmeniz gerekir. (Ben yanlış biri varsa, lütfen beni düzeltin) – JHSaunders

+1

C++ 'da yapıcı bellek tahsis etmiyor, ancak onu başlatıyor ve başka şeyler de orada yapılabiliyor. C++ kurucuları arasında gerçekten çok fark var. nd Python'un __init __() '-method'u, ancak bu soru genel olarak 'super()' super() .__ init __() 'ile ilgilidir. – frans

+0

Python 3'te, süper (UpperBase, self) yerine 'super()' diyebilirsiniz: https://docs.python.org/3/library/functions.html#super – phoenix

İlgili konular