metodos - super clases python
¿Qué es un ejemplo básico de herencia única usando la palabra clave super() en Python? (2)
Digamos que tengo las siguientes clases configuradas:
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 es que puedo) usar super () en este contexto para eliminar el código duplicado?
Asumiendo que quiere que la clase Bar establezca 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 por ejemplo, super considerado dañino . 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
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
Lea más aquí: http://docs.python.org/3.1/library/functions.html#super
EDITAR: Como se dijo en otra respuesta, a veces solo usar Foo.__init__(self, frob, 34)
puede ser la mejor solución. (Por ejemplo, cuando se trabaja con ciertas formas de herencia múltiple).