2

こんにちは、Python でクラスの継承について検索していたところ、複数の継承もサポートしていることがわかりましたが、どういうわけか問題があるようです :o 例を見つけました:

class ParentOne:
    def __init__(self):
        print "Parent One says: Hello my child!"
        self.i = 1

    def methodOne(self):
        print self.i

class ParentTwo:
    def __init__(self):
        print "Parent Two says: Hello my child"

class Child(ParentOne, ParentTwo):
    def __init__(self):
        print "Child Says: hello"
A=Child()

出力

Child Says: hello

child が ParentOne と ParentTwo を継承するとき、これらのクラスが初期化されないのはなぜですか? 継承クラス Child 内でそれらを手動で初期化する必要がありますか? 継承のみを使用して出力されたすべてのメッセージを確認できる正しい例は何ですか?

実際には、それよりも少し複雑です。メソッド解決の順序は、super() への協調呼び出しをサポートするために動的に変更されます。このアプローチは、他のいくつかの多重継承言語では call-next-method として知られており、単一継承言語に見られる super 呼び出しよりも強力です。

手動で初期化する必要がある場合、どうすればより強力になりますか? これらすべての質問を申し訳ありません。前もって感謝します。

4

5 に答える 5

7

This is what super is for:

class ParentOne():
    def __init__(self):
        super().__init__()        
        print("Parent One says: Hello my child!")
        self.i = 1

    def methodOne(self):
        print(self.i)

class ParentTwo():
    def __init__(self):
        super().__init__() 
        print("Parent Two says: Hello my child")

class Child(ParentOne, ParentTwo):
    def __init__(self):
        super().__init__()
        print("Child Says: hello")

A=Child()

prints

Parent Two says: Hello my child
Parent One says: Hello my child!
Child Says: hello
于 2012-10-05T20:06:08.420 に答える
4

基本クラスのメソッドは、呼び出していないため呼び出されません。単一のベースまたは複数のベースがある場合でも、これは常に明示的に行う必要があります。この単純なケースでは、 3 つのクラスすべてsuper().__init__()に追加します。より一般的なアドバイスについては、Python の super() と見なされるスーパー!をお読みください。.

于 2012-10-05T20:08:44.600 に答える
2

あなたの例では、継承されたinitメソッドを子クラスのinitメソッドで具体的にオーバーライドしています。それらすべてを実行したい場合は、親の init メソッドを super() で明示的に呼び出すことができます。

initメソッドをオーバーライドしていない場合、この例では ParentOne のメソッドが使用されます。

于 2012-10-05T20:07:12.680 に答える
2

とても簡単です:

class ParentOne:
    def __init__(self):
        print "Parent One says: Hello my child!"
        self.i = 1

    def methodOne(self):
        print self.i

class ParentTwo:
    def __init__(self):
        print "Parent Two says: Hello my child"

class Child(ParentOne, ParentTwo):
    def __init__(self):
        ParentOne.__init__(self)
        ParentTwo.__init__(self)
        print "Child Says: hello"

A=Child()

問題が解決しました。も使用できますsuper()が、この場合は必要ありません。2 つのメソッドを混在させることはできないことに注意してください。階層内のすべてのクラスで super() を呼び出すか、いずれも呼び出す必要がないかのいずれかです。

于 2012-10-05T21:00:53.570 に答える
0

正しい例は、som,ething along (Python3) です。

class BaseClass:
    def __init__(self):
        print("Initializing base")

class ParentOne(BaseClass):
    def __init__(self):
        super().__init__()
        print("Initializing parent 1")

class ParentTwo(BaseClass):
    def __init__(self):
        super().__init__()
        print("Initializing parent 1")

class Child(ParentOne, ParentTwo):
    def __init__(self):
        super().__init__()
        print("Initializing child")

c = Child()

Python は、よく記述されたメソッド解決順序を使用して、次に呼び出されるメソッドを正しく解決する「スーパー」ビルトインを定義します。まれなケースでは、他の言語にも問題があります - ここで説明されています: http://www.python.org/download/releases/2.3/mro/

于 2012-10-05T20:14:53.307 に答える