2011-11-11 8 views
5

私はPythonで複数の継承の周りに頭を抱えようとしています。Pythonで同じ基本クラスを使った多重継承

は、私は以下の基本クラスがあるとします。

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

との私はそれを継承する2つのクラスを持っているとしましょう:

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を動かす方法はありますか?

モデルにはManagersというカスタムを提供するDjangoパッケージがかなりあるので、私は特に不思議です。しかし、マネージャーのどちらか一方を他のマネージャーから継承して書くことなく、それらを組み合わせる方法はないようです。それだけで両方をインポートし、何とか両方を使用すると良いだろうが、それはできないように見える?

また、Pythonの複数の継承に関する優れたプライマーを指摘するのに役立つと思います。私はMixinsでいくつかの仕事をしています。私は、同じ基本クラスを継承するときに2つの異なるクラスの機能を組み合わせるエレガントな方法があるのだろうかと思います。

うん、愚かな私。それはすべてのタイプミスでした。私は非常に愚かな気分です。私は本当の人生で最高のときに常に正しいクラスを入れていることを約束します。私が切り詰めてこれを試してペーストして、私が台無しにしたときだけでした。

+4

なぜあなたは '' SchoolHouse'で 'School'とsuper'を呼び出していますか?あなたはサブクラスを渡すことになっています。他のクラスでは正しくスーパークラスを行いません。 – delnan

+1

あなたはDjangoでこの質問にタグを付けました。あなたがモデルを扱っていると思います。 Field型の属性を上書きすることはできません... Djangoはエラーを投げます。詳細については、https://docs.djangoproject.com/en/dev/topics/db/models/#field-name-hiding-is-not-permittedを参照してください。 –

+2

優れたプライマーについては、Raymond Hettingerの[Super consider super](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のタイプミス。それは今働く。 –