Ответ @KSab правильный, но я добавлю его, поскольку он помогает проиллюстрировать происходящее (и было предложено в этом ответе). Я немного изменил ваш код, чтобы точно показать, что происходит и в каком порядке эти объекты создаются. Вот код:
import abc
import numpy as np
class Base:
def __init__(self, fs, N, dtype=None):
print('='*80)
print(f"Base fs: {fs}")
print(f"Base N: {N}")
print(f"Base dtype: {dtype}")
class Signal(Base):
def __init__(self, fs, N, dtype=None):
print('='*80)
print(f"Signal self: {self}")
print(f"Signal fs: {fs}")
print(f"Signal N: {N}")
print(f"Signal dtype: {dtype}")
print("Signal(Base) will now call: super().__init__(fs, N, dtype)")
super().__init__(fs, N, dtype)
class AnalysisResultSaver(Base):
def __init__(self, fs=8000, N=250, history_len=1, strict=False, dtype=None):
print('='*80)
print(f"ARS self: {self}")
print(f"ARS fs:{fs} ")
print(f"ARS N: {N}")
print(f"ARS history_len: {history_len}")
print(f"ARS strict: {strict}")
print(f"ARS dtype: {dtype}")
print("ARS(Base) will now call: super().__init__(fs, N, dtype)")
super().__init__(fs, N, dtype)
class BaseAS(abc.ABC, AnalysisResultSaver):
pass
class DFT(BaseAS, Signal):
def __init__(self, fs, N, history_len=1, strict=False):
print('='*80)
print(f"DFT self: {self}")
print(f"DFT fs:{fs} ")
print(f"DFT N: {N}")
print(f"DFT history_len: {history_len}")
print(f"DFT strict: {strict}")
print("DFT(BaseAS, Signal) will now call: super().__init__(fs, N, history_len, strict, np.complex)")
super().__init__(fs, N, history_len, strict, np.complex)
my_d = DFT('fs', 32, 10, True)
Он выдаст такой вывод:
================================================================================
DFT self: <__main__.DFT object at 0x10cabe310>
DFT fs:fs
DFT N: 32
DFT history_len: 10
DFT strict: True
DFT(BaseAS, Signal) will now call: super().__init__(fs, N, history_len, strict, np.complex)
================================================================================
ARS self: <__main__.DFT object at 0x10cabe310>
ARS fs:fs
ARS N: 32
ARS history_len: 10
ARS strict: True
ARS dtype: <class 'complex'>
ARS(Base) will now call: super().__init__(fs, N, dtype)
================================================================================
Signal self: <__main__.DFT object at 0x10cabe310>
Signal fs: fs
Signal N: 32
Signal dtype: <class 'complex'>
Signal(Base) will now call: super().__init__(fs, N, dtype)
================================================================================
Base fs: fs
Base N: 32
Base dtype: <class 'complex'>
================================================================================
Кроме того, это MRO для каждого класса:
>>> DFT.mro()
[<class '__main__.DFT'>, <class '__main__.BaseAS'>, <class 'abc.ABC'>, <class '__main__.AnalysisResultSaver'>, <class '__main__.Signal'>, <class '__main__.Base'>, <class 'object'>]
>>> BaseAS.mro()
[<class '__main__.BaseAS'>, <class 'abc.ABC'>, <class '__main__.AnalysisResultSaver'>, <class '__main__.Base'>, <class 'object'>]
>>> AnalysisResultSaver.mro()
[<class '__main__.AnalysisResultSaver'>, <class '__main__.Base'>, <class 'object'>]
>>> Signal.mro()
[<class '__main__.Signal'>, <class '__main__.Base'>, <class 'object'>]
>>> Base.mro()
[<class '__main__.Base'>, <class 'object'>]