2015-07-01 6 views
7

çalışır. child yapıcısı İçinde defalarca parent tanımlanan üye işlev foo() arayarak list tipi üye değişkeni xs başlatılıyor ediyorum. Ben açıkça döngü ve foo() tarafından döndürülen her değeri ekleyerek xs başlatmak eğer, her şey gayet iyi çalışıyor olduğu ortaya çıkar. Bir liste anlayışı içinde aynı şeyi yapmak çalışırsanız çocuğun in başlatıcısı liste anlama ebeveynin yöntemini çağırın alamazsın ama açık döngü <code>child</code> sınıf <code>parent</code> sınıftan miras

Ancak, bana atılan bir garip hatası alıyorum. Bu hata neden oluşuyor? Bu durumda liste kavraması ile açık döngü arasındaki fark nedir?

nasıl çalışır kodu için MWE:

class parent(object): 
    def __init__(self): 
     self.x = 5 

    def foo(self, a): 
     return self.x 


class child(parent): 
    def __init__(self): 
     super().__init__() 

     self.xs = [] 
     for i in range(9): 
      self.xs.append(super().foo(i))  

mychild = child() 

child ait ancak liste anlayışı ile tanımı:

class child(parent): 
    def __init__(self): 
     super().__init__() 
     self.xs = [super().foo(i) for i in range(9)] 

hata söz konusu:

% python test.py 
Traceback (most recent call last): 
    File "test.py", line 20, in <module> 
    mychild = child() 
    File "test.py", line 17, in __init__ 
    self.xs = [super().foo(i) for i in range(9)] 
    File "test.py", line 17, in <listcomp> 
    self.xs = [super().foo(i) for i in range(9)] 
TypeError: super(type, obj): obj must be an instance or subtype of type 
zsh: exit 1  python test.py 

cevap

6

listesi anlayışlar aslında ayrı bir kapsamda çalışırlar (bkz. ör. Why is one class variable not defined in list comprehension but another is?), bu nedenle hiçbir argüman içermeyen super örtük formu, liste kavramasında çalışmaz. ,

  1. super açık formu kullanın sınıf ve örnek argümanlar geçen:

    Sen standart for döngü geri dönmek istemiyorum varsayarak iki seçeneğiniz var super(child, self).foo(i); ya

  2. Eğer parent den foo miras ettiğimiz gibi
  3. , sadece örneğinde diyoruz: self.foo(i).
İlgili konular