1

私の質問の重複があるはずですが、見つかりませんでした。私は最終的にOOPを学ぼうとしている初心者です。次のコードでは、3 つのレベルのクラスがあります。サブクラスは、基本クラスから属性を継承しているように見えますが、直接の親からは継承していないようです。

class Option(object):
    def __init__(self, *args, **kwargs):
        self.strike_type = kwargs.get('strike_type')
        self.multiplier = kwargs.get('mutiplier', 100)
        self.exp_months = kwargs.get('exp_months', 1)
        self.strike_steps = kwargs.get('strike_steps', 1)


class Put(Option):
    def __init__(self, *args, **kwargs):
        super(Option, self).__init__(*args, **kwargs)
        self.option_type = 'put'


class ShortPut(Put):
    def __init__(self, *args, **kwargs):
        super(Put, self).__init__(*args, **kwargs)
        self.ratio = kwargs.pop('ratio', 1)
        self.qty_mult = -1


shortput = ShortPut(strike_type=-1, exp_months=6, strike_steps=2, ratio=2)

shortput.ratio #class ShortPut
2

shortput.exp_months #class Option
6

shortput.option_type #class Put
AttributeError: 'ShortPut' object has no attribute 'option_type'

dir(shortput) #dunder entries removed
['exp_months',
'multiplier',
'qty_mult',
'ratio',
'strike_steps',
'strike_type']

そのため、Option または ShortPut のいずれかにカット アンド ペーストすると、属性は正常に機能します。また、init モジュールの順序を変更しようとしましたが、super への呼び出しが他の属性の前または後に行われた場合、違いはないようです。ShortPut→Put→Optionと引数が流れていますが、中間層の属性が気に入らないようです。

フォローアップ - put クラスを直接呼び出すことはできません:

put = Put(strike_type=-1, exp_months=6, strike_steps=2, ratio=2)
TypeError: object.__init__() takes no parameters

何が起こっているのかについての洞察は大歓迎です。

4

1 に答える 1

2

を使用する場合super、最初の引数は、そのスーパークラスではなく、呼び出し元のクラスにする必要があります。したがって、 inPutを使用する必要がsuper(Put, self)あり、 inを使用ShortPutする必要がありますsuper(ShortPut, self)

于 2013-08-29T16:59:01.843 に答える