回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我写了钻石继承类。如果在同一级别有两个类,那么构造函数的参数列表长度不同,并且取决于基声明列表中的声明顺序,所有操作正常或立即抛出错误</p>
<pre><code>class DFT(Common.BaseAS, Common.Signal):
def __init__(self, fs, N, history_len=1, strict=False):
super().__init__(fs, N, history_len, strict, np.complex)
class BaseAS(abc.ABC, AnalysisResultSaver):
No constructor here
class AnalysisResultSaver(Base):
def __init__(self, fs=8000, N=250, history_len=1, strict=False, dtype=None):
super().__init__(fs, N, dtype)
class Signal(Base):
def __init__(self, fs, N, dtype=None):
super().__init__(fs, N, dtype)
class Base:
def __init__(self, fs, N, dtype=None):
Stuff
</code></pre>
<p>构造函数的调用顺序如下:
<code>DFT</code>;
<code>AnalysisResultSaver</code>;
<code>Signal</code>;
<code>Base</code></p>
<p>在这种情况下,一切正常,但我的问题是
1) 如果没有直接指示哪些参数是正确的,那么参数是如何传递给<code>Signal</code>构造函数的,它只是被修剪到前两个吗</p>
<p>但如果我改变DFT中基的顺序,我得到</p>
<pre><code>super().__init__(fs, N, history_len, strict, np.complex)
TypeError: __init__() takes from 3 to 4 positional arguments but 6 were given
</code></pre>
<p>我知道它改变了mro,但在第一种情况下,它工作得很好</p>
<p>如果我想通过<code>Common.BaseAS.__init__()</code>直接调用构造函数
而且<code>Common.Signal.__init__()</code>than信号构造函数被调用了两次,所以对BaseAS的调用会调用信号构造函数,即使它不是它的父构造函数</p>
<pre><code>Common.BaseAS.__init__(self, fs, N, history_len, strict, np.complex)
Common.Signal.__init__(self, fs, N)
</code></pre>
<p>那么<code>BaseAS</code>如何调用<code>Signal</code>构造函数呢</p>