python中以下语句为啥会有两个__init__

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中以下语句为啥会有两个__init__相关的知识,希望对你有一定的参考价值。

class SMACrossOver(strategy.BacktestingStrategy):
def __init__(self, feed, instrument, smaPeriod,cash=10000): #100w
strategy.BacktestingStrategy.__init__(self, feed,cash)

参考技术A 这是固定格式 语法要求的,表示初始化的意思
这是固定格式 语法要求的,表示初始化的意思
这是固定格式 语法要求的,表示初始化的意思
参考技术B 这是固定格式 语法要求的,表示初始化的意思追问

一个就初始化了啊,为何有两个init最后两句都有

追答

个人感觉第二个应该能去掉,因为构造函数是默认被调用的

个人感觉第二个应该能去掉,因为构造函数是默认被调用的

参考技术C 第二个__init__好像是继承父类的函数吧,以免被第一个篡改

为啥我收到错误:__init__() 缺少 1 个必需的位置参数?

【中文标题】为啥我收到错误:__init__() 缺少 1 个必需的位置参数?【英文标题】:Why am I getting the error: __init__() missing 1 required positional argument?为什么我收到错误:__init__() 缺少 1 个必需的位置参数? 【发布时间】:2021-09-02 03:59:27 【问题描述】:

Fedora 34、Python 3.9.5

我用一个继承自其他两个类(其中一个继承了 QWidget 功能)的类编写代码。结果,这个简单的类没有被初始化。

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QWidget
 
class M_A(type(QWidget), type):pass
class A(QWidget, metaclass=M_A):
    def __init__(self):
        QWidget.__init__(self)
         
class B:
    def __init__(self, controller):
        self.controller = controller
         
         
class M_C(type(A), type(B)):pass
class C(A, B, metaclass=M_C):
    def __init__(self, controller):
        A.__init__(self)
        B.__init__(self, controller)
         
         
app = QtWidgets.QApplication([])
C(controller=19)


Traceback (most recent call last):
  File "/home/ivan/eclipse-workspace/123/Exp.py", line 22, in <module>
    C(controller=19)
  File "/home/ivan/eclipse-workspace/123/Exp.py", line 17, in __init__
    A.__init__(self)
  File "/home/ivan/eclipse-workspace/123/Exp.py", line 7, in __init__
    QWidget.__init__(self)
TypeError: __init__() missing 1 required positional argument: 'controller'

错在哪里?

【问题讨论】:

在 SOLVED 未添加到帖子标题中,请查看tour 以便您知道该怎么做。 为什么要创建这些元类?无论如何都不需要它们。 【参考方案1】:

官方实现混合示例中的docs指出

这遵循与我们的 Person 实现类似的模式,但请注意我们为 age 参数提供了默认值

(强调我的)

应用于你的case控制器必须有一个默认值,例如0:

class B:
    def __init__(self, controller=0):
        self.controller = controller

【讨论】:

以上是关于python中以下语句为啥会有两个__init__的主要内容,如果未能解决你的问题,请参考以下文章

为啥不导入 Python [重复]

为啥允许在 Python 中使用 super 从 __init__ 返回一个值?

复杂包结构中的 Python 导入语句?

__init__ 为啥python类需要初始化

为啥我收到错误:__init__() 缺少 1 个必需的位置参数?

为啥 Python 在创建实例时不调用实例方法 __init__() 而是调用类提供的 __init__() ?