Python类属性不继承

时间:2013-08-29 16:57:13

标签: python inheritance python-2.7

我确信我的问题必须重复,但还没有找到。我是一个试图最终学习OOP的新手。在下面的代码中,我有三个级别的类 - 子类似乎是从基类继承属性,但不是从它的直接父级继承:

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 to Option,但它似乎不喜欢中产阶级中的属性。

followup - 我无法直接调用put类:

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

对于正在发生的事情的任何见解将不胜感激。

1 个答案:

答案 0 :(得分:2)

当你使用super时,第一个参数应该是你进行调用的类,而不是它的超类。因此,在Put中您应该使用super(Put, self),而在ShortPut中您应该使用super(ShortPut, self)