0

1 つのクラスが 2 つのクラスを継承すると仮定します。一方は 1 つの引数を取り、もう一方は引数を取りません。サブクラスの順序とは関係なく、引数を受け入れるクラスに引数が確実に渡されるようにするにはどうすればよいですか?

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

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について非常に不安定な知識を持っています!)

4

2 に答える 2

3

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

直接初期化したいクラスを使用するだけです:

class MyClass(Generic2, Generic):
    def __init__(self, data):
        Generic.__init__(data)
        self.data = data
于 2012-05-12T21:37:47.947 に答える
1

コメントとしては長すぎる拡張機能とコメント:

クラス階層がどのように見えるかが正確にわかっている場合は、呼び出したいメソッドを直接呼び出すことができます。クラス階層がどのように見えるかわからない場合は、super() が必要です。これは、たとえばライブラリを作成する場合です。人々がそのライブラリをどのように使用するか、またどの基本クラスを使用するかはわかりません。したがって、すべてのクラスのインターフェースが同じであること、およびそれらすべてが super() を呼び出すことを確認する必要があります。

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

于 2012-05-13T08:03:39.447 に答える