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)
这是固定格式 语法要求的,表示初始化的意思
这是固定格式 语法要求的,表示初始化的意思 参考技术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 中使用 super 从 __init__ 返回一个值?