2012-05-12 14 views
0

クラスは2つのクラスを継承するとしましょう。 サブクラスの順序とは独立して、引数を受け入れるクラスに引数が渡されるようにするにはどうすればよいですか?super()を使って右の継承クラスに引数を渡す

具体的には、私はこの例に問題があります。

class Generic(object): 
    def __init__(self,data): 
     self.data=data 
    def do_data(self): 
     print(self.data) 
class Generic2(object): 
    def __init__(self): 
     pass 
    def no_data(self): 
     print("No_data") 
class MyClass(Generic2,Generic): 
    def __init__(self,data): 
     self.data=data 
     super().__init__(data) 
A=MyClass("A") 

が原因のinit引数にはTypeErrorを返します。エラーは単に使用することによって修正される

... 
class MyClass(Generic,Generic2): 
    ... 

を私はsuper()を初期化するクラスを決定するMROを使用していることを前提としています。

質問:Python3では、サブクラスの順序とは関係なく、引数が正しいサブクラスに確実に送信されます。

は(穏やかな...私は何もOOの非常にフレーク状の知識を持っている!)

答えて

3

関連:https://fuhm.net/super-harmful/

class MyClass(Generic2, Generic): 
    def __init__(self, data): 
     Generic.__init__(data) 
     self.data = data 
+0

むしろ[Pythonのsuper()と思っています!](http://rhettinger.wordpress.com/2011/05/26/super-considered-super/)は、問題を解決するのではなく、問題を解決します;)短いバージョン:注文の大部分を制御せず、一貫性のあるインターフェースと共通の基本クラスを解決します。 – delnan

1

延長のビットと、そのコメントに対して長すぎるコメント:あなたは正確に知っている

があなたのクラス階層がすることができますどのように見えるか

ちょうどあなたが直接初期化したいクラスを使用します直接呼び出すメソッドを呼び出します。クラス階層の見た目がわからないときは、super()が必要です。これは、たとえば、ライブラリを作成する場合です。あなたは人々がどのようにその図書館を使うのか、あなたが使っているベースクエストのどれを使うのか分かりません。したがって、すべてのクラスのインターフェイスが同じで、すべてがsuper()を呼び出すようにする必要があります。

しかし、クラスのインターフェイスが同じでないとすぐに、super()は役に立ちません。なぜなら、もはや任意の順序でクラスを呼び出すことができなくなるからです。 にはを特定の順序で初期化する必要があります。次に、その順序を明示的にする必要があります。

+0

ありがとう!それは理にかなっている。この明確な説明に感謝します。 – mauscope

関連する問題