2

このような継承構造を処理する最良の方法は何ですか:

class A(object):
    def __init__(self):
        print('A')

class B(A):
    def __init__(self, foo):
        super(B, self).__init__()
        self.foo = foo
        print('B')

class C(A):
    def __init__(self, bar):
        super(C, self).__init__()
        self.bar = bar
        print('C')

class D(B, C):
    def __init__(self, foo, bar):
        super(D, self).__init__(foo, bar)

基本的に、私は呼び出すことができるようにしたい:

>>> d = D('bar', 'ram ewe')
>>> d.foo
'bar'
>>> d.bar
'ram ewe'

現在、super(D, self).__init__(foo, bar)昇給はTypeError: __init__() takes exactly 2 arguments (3 given)

編集

ダニエル・ローズマンに感謝します。

class A(object):
    def __init__(self, *args, **kwargs):
        print('A')

class B(A):
    def __init__(self, foo, *args, **kwargs):
        super(B, self).__init__(*args, **kwargs)
        self.foo = foo
        print('B')

class C(A):
    def __init__(self, bar, *args, **kwargs):
        super(C, self).__init__(*args, **kwargs)
        self.bar = bar
        print('C')

class D(B, C):
    def __init__(self, foo, bar, *args, **kwargs):
        super(D, self).__init__(foo, bar, *args, **kwargs)
4

1 に答える 1

3

最良の方法は、メソッドが定義され、*args, **kwargs構文を使用して呼び出されることを常に確認することです。つまり、必要なパラメーターを取得し、残りを無視します。

于 2013-08-27T06:10:20.067 に答える