2011-11-11 23 views
5

Estoy tratando de entender mi herencia múltiple en Python.Herencia múltiple con las mismas clases base en Python

Supongamos que tengo la siguiente clase base:

class Structure(object): 
    def build(self, *args): 
     print "I am building a structure!" 
     self.components = args 

Y vamos a decir que tengo dos clases que heredan de ella:

class House(Structure): 
    def build(self, *args): 
     print "I am building a house!" 
     super(House, self).build(*args) 

class School(Structure): 
    def build(self, type="Elementary", *args): 
     print "I am building a school!" 
     super(School, self).build(*args) 

Por último, una crear una clase que utiliza herencia múltiple:

class SchoolHouse(School, House): 
    def build(self, *args): 
     print "I am building a schoolhouse!" 
     super(School, self).build(*args) 

Luego, creo un objeto SchoolHouse y ejecuto build en él:

>>> sh = SchoolHouse() 
>>> sh.build("roof", "walls") 
I am building a schoolhouse! 
I am building a house! 
I am building a structure! 

Así que me pregunto - ¿qué pasó con la clase School? ¿Hay alguna manera de hacer que Python funcione de alguna manera?

Me pregunto específicamente porque hay un buen número de Django paquetes por ahí que proporcionan a medida para los modelos Managers. Pero no parece haber una manera de combinarlos sin escribir uno o el otro de los administradores como herencia del otro. Sería bueno importar ambos y usar ambos de alguna manera, pero parece que no se puede hacer.

También supongo que sería útil señalar un buen manual sobre la herencia múltiple en Python. He trabajado un poco con Mixins antes y realmente disfruto de usarlos. Supongo que me pregunto si existe alguna manera elegante de combinar la funcionalidad de dos clases diferentes cuando heredan de la misma clase base.

Yup, silly me. Fue un error tipográfico todo el tiempo. Me siento muy tonto. Lo prometo, siempre puse la clase correcta cuando estuve súper en la vida real, fue solo cuando estaba cortando y pegando para probar esto que me equivoqué.

+4

¿por qué llama '' super' con School' en 'SchoolHouse'? Se supone que debes pasar la subclase, no ninguna de las superclases (lo haces correctamente en las otras clases). – delnan

+1

Has etiquetado esta pregunta con Django, así que imagino que estás tratando con modelos. Tenga en cuenta que no puede anular los atributos que son tipos de campo ... Django le arrojará errores. Consulte https://docs.djangoproject.com/en/dev/topics/db/models/#field-name-hiding-is-not-permitted para obtener más información al respecto. –

+2

Para obtener una excelente imprimación, consulte [Súper considerado súper] de Raymond Hettinger (http://rhettinger.wordpress.com/2011/05/26/super-considered-super/). –

Respuesta

15

Su super() llamada en es incorrecta.

Es:

super(School, self).build(*args) 

que debe ser:

super(SchoolHouse, self).build(*args) 
+0

Errores tipográficos. Ahora funciona. –

Cuestiones relacionadas