我确信我的问题一定有重复,但还没有找到。我是一个试图最终学习 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 到 Option,但似乎不喜欢中产阶级的属性。
跟进 - 我不能直接调用 put 类:
put = Put(strike_type=-1, exp_months=6, strike_steps=2, ratio=2)
TypeError: object.__init__() takes no parameters
任何对正在发生的事情的见解将不胜感激。