gpt4 book ai didi

python - Python 中具有不同参数列表的父类(super class)构造函数调用

转载 作者:行者123 更新时间:2023-12-01 21:26:33 30 4
gpt4 key购买 nike

我编写了具有菱形继承(钻石问题)的类。如果有两个类处于同一级别,则构造函数具有不同长度的参数列表,并且根据基类声明列表中的声明顺序,一切正常或立即抛出错误

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

构造函数按顺序调用: DFT ; AnalysisResultSaver ; Signal ; Base ;

在这种情况下一切正常,但我的问题是1) 参数如何传递给Signal构造函数,如果没有直接指示哪些参数是正确的,它是否只是修剪为前两个?

但是如果我改变 DFT 中碱基的顺序,那么我会得到

super().__init__(fs, N, history_len, strict, np.complex)
TypeError: __init__() takes from 3 to 4 positional arguments but 6 were given

我知道它会改变,但在第一种情况下它工作正常

如果我想直接通过 Common.BaseAS.__init__() 调用构造函数和Common.Signal.__init__()比 Signal 构造函数被调用两次,因此对 BaseAS 的调用会以某种方式调用 Signal 构造函数,即使它不是其父构造函数。

Common.BaseAS.__init__(self, fs, N, history_len, strict, np.complex)
Common.Signal.__init__(self, fs, N)

那么2)怎么能BaseAS调用Signal构造函数?

最佳答案

在您的示例中,AnalysisResultSaver.__init__ 中的 super 调用是调用 Signal.__init__ 的。这可能是违反直觉的,因为 Signal 不是 AnalysisResultSaver 的父类(super class),并且是多重继承和 super 函数工作的有趣方式的示例。 Python。

特别是,当您在 AnalysisResultSaver 中编写 super() 时,这实际上是 super(AnalysisResultSaver, self) 的简写。那么这实际上是做什么的呢?它会查看您传入的实际实例的方法解析顺序 (self),并尝试在您传入的类之后查找第一个匹配的方法 (AnalysisResultSaver)。

如果您按照预期在 AnalysisResultSaver 中打印 self.__class__,您将看到该对象本身是 DFT 的实例。如果您查看该类 self.__class__.__mro__ 或仅 DFT.__mro__ 上的方法解析顺序,您将看到一个类列表:DFTBaseASAnalysisResultSaver信号Base对象

请注意 AnalysisResultSaver 之后的第一个是 Signal,这就是它如何决定 Signal.__init__ 是接下来应该调用的特定构造函数.

如果你有兴趣,我建议你阅读更多关于Python的多重继承和super函数的具体内容;网上有许多资源更全面地涵盖了这个主题。

关于python - Python 中具有不同参数列表的父类(super class)构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60792730/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com