2014-04-16 16 views
21

Ho il seguente codice Python 2.7:Python eccellente eredità __init__

class Frame: 
    def __init__(self, image): 
     self.image = image 

class Eye(Frame): 
    def __init__(self, image): 
     super(Eye, self).__init__() 
     self.some_other_defined_stuff() 

sto cercando di estendere il metodo __init__() in modo che quando ho un'istanza di un 'occhio' si fa un sacco di altre cose (auto. some_other_defined_stuff()), oltre a ciò che Frame imposta. Frame.__init__() deve essere eseguito per primo.

io ottenere il seguente errore:

super(Eye, self).__init__() 
TypeError: must be type, not classobj 

Il che non capisco il motivo logico. Qualcuno può spiegare per favore? Sono abituato a digitare semplicemente "super" in ruby.

+3

'Frame' deve estendere' oggetto'. 'super' funzionerà solo su classi di nuovo stile. – That1Guy

risposta

40

ci sono due errori qui:

  1. super() funziona solo per new-style classes; utilizzare object come classe base per Frame per utilizzare semantica di nuovo stile.

  2. È ancora necessario chiamare il metodo sottoposto a override con gli argomenti giusti; passare image alla chiamata __init__.

Così il codice corretto sarebbe:

class Frame(object): 
    def __init__(self, image): 
     self.image = image 

class Eye(Frame): 
    def __init__(self, image): 
     super(Eye, self).__init__(image) 
     self.some_other_defined_stuff() 
+0

Il riferimento a 'object' è ridondante in Python> 3.X? – gented

+0

@gented: sì, 'object' come classe base è implicito in Python 3 (poiché non ci sono più classi vecchio stile). –

11

Frame deve estendersi object perché solo i nuovi stili di classi supportano super chiamata effettuata in Eye in questo modo:

class Frame(object): 
    def __init__(self, image): 
     self.image = image 

class Eye(Frame): 
    def __init__(self, image): 
     super(Eye, self).__init__(image) 
     self.some_other_defined_stuff() 
+0

Hrm, downvoting questo sembra duro; solo perché l'autore ha mancato l'argomento 'image' non passato? –

+2

@MartijnPieters seriamente eh? riparato comunque. – myusuf3

0

Hi vedere i miei codici di lavoro per python 2.7

__metaclass__ = type 
class Person: 
    def __init__(self, first, last, age): 
     self.firstname = first 
     self.lastname = last 
     self.age = age 

    def __str__(self): 
     return self.firstname + " " + self.lastname + ", " + str(self.age) 

class Employee(Person): 
    def __init__(self, first, last, age, staffnum): 
     super(Employee, self).__init__(first, last, age) 
     self.staffnumber = staffnum 

    def __str__(self): 
     return super(Employee, self).__str__() + ", " + self.staffnumber 


x = Person("Marge", "Simpson", 36) 
y = Employee("Homer", "Simpson", 28, "1007") 

print(x) 
print(y) 
+1

Per migliorare questa risposta, controlla la tua formattazione e fornisci una spiegazione per il tuo codice. –

Problemi correlati