2009-07-23 7 views
26

Digamos que he puesto las siguientes clases hasta:¿Qué es un ejemplo básico de herencia única usando la palabra clave super() en Python?

class Foo: 
    def __init__(self, frob, frotz): 
      self.frobnicate = frob 
      self.frotz = frotz 
class Bar: 
    def __init__(self, frob, frizzle): 
      self.frobnicate = frob 
      self.frotz = 34 
      self.frazzle = frizzle 

¿Cómo puedo (si puedo en absoluto) utilizar super() en este contexto para eliminar el código duplicado?

+0

[http://stackoverflow.com/questions/904036/chain-calling-parent-constructors-in-python](http://stackoverflow.com/questions/904036/chain-calling-parent-constructors-in-python) –

Respuesta

25

En Python> = 3.0, así:

class Foo(): 
    def __init__(self, frob, frotz) 
     self.frobnicate = frob 
     self.frotz = frotz 

class Bar(Foo): 
    def __init__(self, frob, frizzle) 
     super().__init__(frob, 34) 
     self.frazzle = frizzle 

Lee más aquí: http://docs.python.org/3.1/library/functions.html#super

EDIT: Como se ha dicho en otra respuesta, a veces simplemente usando Foo.__init__(self, frob, 34) puede ser la mejor solución. (Por ejemplo, cuando se trabaja con ciertas formas de herencia múltiple)

+9

Para que quede claro, esto es solo python> = 3.0. Para pitones más viejas (pero solo aquellas con "clases de estilo nuevo"), @ire_and_curses answer describe lo que se debe hacer. –

29

Suponiendo que desea clase barra para ajustar el valor 34 dentro de su constructor, esto funcionaría:

class Foo(object): 
    def __init__(self, frob, frotz): 
      self.frobnicate = frob 
      self.frotz = frotz 

class Bar(Foo): 
    def __init__(self, frob, frizzle): 
      super(Bar, self).__init__(frob, frizzle) 
      self.frotz = 34 
      self.frazzle = frizzle 


bar = Bar(1,2) 
print "frobnicate:", bar.frobnicate 
print "frotz:", bar.frotz 
print "frazzle:", bar.frazzle 

Sin embargo, super presenta sus propias complicaciones. Ver p. super considered harmful. Para completar, aquí está la versión equivalente sin super.

class Foo(object): 
    def __init__(self, frob, frotz): 
      self.frobnicate = frob 
      self.frotz = frotz 

class Bar(Foo): 
    def __init__(self, frob, frizzle): 
      Foo.__init__(self, frob, frizzle) 
      self.frotz = 34 
      self.frazzle = frizzle 


bar = Bar(1,2) 
print "frobnicate:", bar.frobnicate 
print "frotz:", bar.frotz 
print "frazzle:", bar.frazzle 
+1

¿Por qué configura Bar.frotz = frizzle a través del constructor de la superclase y luego lo configura en 34 por separado? ¿no deberías simplemente tener __init __ (frob, 34)? – Victor

+2

Sí, eso también funcionaría, y sería más limpio. El ejemplo es bastante artificial (establecer una constante en un constructor), pero estaba tratando de estar lo más cerca posible del original. –

+0

no sé si esa es una buena manera de hacerlo ... considere el caso en que el super constructor realiza una operación en frotz y frizzle es una clase, su código no se ejecutará o cosas peores podrían pasar. – Victor

Cuestiones relacionadas