2016-06-28 16 views
2

Ich versuche zu verstehen, wie super in Python verwendenSuper in Python 2.7

class people: 
name = '' 
age = 0 
    __weight = 0 

def __init__(self,n,a,w): 
    self.name = n 
    self.age = a 
    self.__weight = w 
def speak(self): 
    print("%s is speaking: I am %d years old" %(self.name,self.age)) 


class student(people): 
grade = '' 
def __init__(self,n,a,w,g): 
    #people.__init__(self,n,a,w) 
    super(student,self).__init__(self,n,a,w) 
    self.grade = g 

def speak(self): 
    print("%s is speaking: I am %d years old,and I am in grade %d"%(self.name,self.age,self.grade)) 


s = student('ken',20,60,3) 
s.speak() 

Der obige Code folgenden Fehler wird:

--------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-147-9da355910141> in <module>() 
    10 
    11 
---> 12 s = student('ken',20,60,3) 
    13 s.speak() 

<ipython-input-147-9da355910141> in __init__(self, n, a, w, g) 
     3  def __init__(self,n,a,w,g): 
     4   #people.__init__(self,n,a,w) 
----> 5   super(student).__init__(self,n,a,w) 
     6   self.grade = g 
     7 

TypeError: must be type, not classobj 

Ich bin verwirrt darüber, warum ich nicht super(student,self).__init__(self,n,a,w) verwenden kann in diesem Fall, und warum muss ich people.__init__(self,n,a,w)

Hilfe verwenden?

+2

Pass 'self' zu' super', nicht '__init__': 'super (Student, selbst) .__ init __ (n, a, w)' –

+0

@MosesKoledoye nein, das ist es nicht, auch mit Super (Student, Selbst) .__ Init __ (n, a, w), ich bekomme immer noch nicht Classobj Fehler – ikel

Antwort

7

Ihre Basisklasse people sollte von der object Klasse abgeleitet werden, um es zu einer neuen Stilklasse zu machen, die super() funktionieren lässt.

Sie sollten dann verwenden super wie:

super(student, self).__init__(n,a,w) 

Old-Style-Klassen verhalten sich ganz anders, und ich verstehe nicht, sie

+0

ok, ich mache einige Änderungen entsprechend auf Menschen Klasse: Klasse Menschen (Objekt), jetzt wenn Super (Student, Selbst) verwenden .__ Init __ (selbst, n, a, w), ich habe TypeError: __init __() dauert genau 4 Argumente (5 gegeben), warum ist das? – ikel

+0

Keine Notwendigkeit, "selbst" als Argument an ein gebundenes "__init__" von Super-Objekt zu übergeben. –

+0

@ IljaEverilä Entfernen von selbst init funktioniert! nur noch eine Frage, warum nennst du Leute (Objekt) neuen Stil? ist das neu in Python 2.7 im Vergleich zu früheren Versionen? – ikel