2011-11-11 40 views
5

我试图围绕Python中的多重继承进行封装。在Python中具有相同基类的多继承

假设我有以下的基类:

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

而且让我们说我有一个从它继承了两个类:

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) 

最后,创建使用多重继承的一个类:

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

然后,我创建一个SchoolHouse对象并在其上运行build

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

所以我想知道 - School类发生了什么?有没有办法让Python以某种方式运行?

我特别想知道,因为有Django中的相当数量的包在那里提供了自定义模式Managers。但是,似乎没有一种方法可以将其中一方或另一方的管理人员从另一方继承下来。只需导入两者并以某种方式使用它们会很好,但看起来不能完成?

另外,我想这刚刚帮助会提出,在Python中多重继承的好底漆。我之前和Mixins做过一些工作,并且非常喜欢使用它们。我想我只是想知道是否有任何优雅的方式来结合两个不同类的功能,当他们从同一个基类继承。

是啊,我傻。这是一个错字。我觉得很愚蠢。我保证,当我在现实生活中超级时,我总是会选择合适的课程,只有当我剪切并粘贴才能尝试这一点时,我就会搞砸了。

+4

为什么你叫'和'School'在'SchoolHouse' super'?您应该传递子类,而不是任何超类(您在其他类中正确执行)。 – delnan

+1

你已经用Django标记了这个问题,所以我想你正在处理模型。请记住,你不能覆盖字段类型的属性... Django会给你带来错误。有关更多信息,请参阅https://docs.djangoproject.com/en/dev/topics/db/models/#field-name-hiding-is-not-permitted。 –

+2

对于一个优秀的底漆,请参阅雷蒙德Hettinger的[超级考虑超级](http://rhettinger.wordpress.com/2011/05/26/super-considered-super/)。 –

回答

15

您的super()致电SchoolHouse是错误的。

是:

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

它应该是:

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

Boo错别字。它现在有效。 –

相关问题