pyqt5 多类继承老是报错missing required positional argument

PackInterface 代码

class PackInterface(QObject):
    def __init__(self,
                 config_dict:Union[dict, defaultdict]):
        super(PackInterface, self).__init__()
        self.PackWidget = QWidget()
        self.Pack_SourceFile = NPlianEdit(config_dict)
        self.Pack_ImagePath = NPlianEdit(config_dict)
        self.Pack_HintLineEdit = QLineEdit()
        self.Pack_HintLineEdit.setMinimumHeight(25)
        self.Pack_SourceFile.setPlaceholderText('源文件, 必填项, 支持文件拖拽')
        self.Pack_ImagePath.setPlaceholderText('程序图标, 可为空, 支持文件拖拽')
        packvbox = QVBoxLayout()
        packvbox.addWidget(self.Pack_SourceFile)
        packvbox.addWidget(self.Pack_ImagePath)
        packvbox.addWidget(self.Pack_HintLineEdit)
        self.PackWidget.setLayout(packvbox)

AnalysisInterface 继承 PackInterface

class AnalysisInterface(QMainWindow,
                        AnalysisStyle,
                        QrcodeStyle,
                        QRcodeInterface,
                        PackInterface):
    general_refister_count = 3
    ExitClick = pyqtSignal(bool)
    MainClick = pyqtSignal(bool)
    StickThreadConnect = pyqtSignal(bool)
    AnalysisThreadConnect = pyqtSignal(bool)
    UnicodeThreadConnect = pyqtSignal(bool)
    C2aThreadConnect = pyqtSignal(bool)
    A2cThreadConnect = pyqtSignal(bool)
    ExExThreadConnect = pyqtSignal(bool)
    ExDirThreadConnect = pyqtSignal(bool)
    FileCopyThreadConnect = pyqtSignal(bool)
    XmaindExtractThreadConnect = pyqtSignal(bool)
    PackThreadConnect = pyqtSignal(bool)
    def __init__(self,
                 database:QSqlDatabase,
                 config_dict:dict
                 ):
        super(AnalysisInterface, self).__init__()
        super(AnalysisStyle, self).__init__()
        super(QrcodeStyle, self).__init__()
        super(QRcodeInterface, self).__init__(config_dict)

报错: PackInterface.__init__() missing 1 required positional argument: 'config_dict'

另一个程序代码又没问题,同样都是多继承(例子2):

SecondaryPLFCModule 代码

class SecondaryPLFCModule(QObject):
    DEFAULTRATEVALUE = 1
    DEFAULTVOLUMEVALUE = 50
    DEFAULTPRIVATENAME = 'Administer'
    def __init__(self, config_dict:Union[dict]):
        super(SecondaryPLFCModule, self).__init__()
        self.mediaplayer = QMediaPlayer()
        self.medialist = QMediaPlaylist()
        self.medialist.setPlaybackMode(QMediaPlaylist.Loop)
        self.medialistwidget = NListWidget(config_dict)
        self.medialistwidget.sortItems(Qt.DescendingOrder)

ICmediaGui继承SecondaryPLFCModule,代码正常运行

class ICmediaGui(QMainWindow,
                 ICmeiaPlayStyle,
                 SecondaryPLFCModule,
                 SecondaryTOPMLudule,
                 SecondaryTPCDModule,
                 SecondaryUSERModule):
    LYRICFORMAT = ['lrc', None, 'txt']
    MainClick = pyqtSignal(bool)
    ExitClick = pyqtSignal(bool)
    MediaList_UpdateFlag = pyqtSignal(MediaListCutType)
    MediaVideo_SpaceFlag = pyqtSignal(bool)
    Top_Visit_OccaConnect = pyqtSignal(bool)
    Top_DriverVisit_OccaConnect = pyqtSignal(bool)
    Top_Drodown_OccaConnect = pyqtSignal(bool)
    Account_Exit_OccaConnect = pyqtSignal(bool)
    Centra_ListWidget_Width = 260
    _enumatate_gcut = MediaListCutType.GeneralCut
    _enumatate_gadd = MediaListCutType.GeneralJustAddup
    _enumatate_mcut = MediaListCutType.MusicCut
    _enumatate_madd = MediaListCutType.MusicJustAddup
    _enumatate_vcut = MediaListCutType.VideoCut
    _enumatate_vadd = MediaListCutType.VideoJustAddup
    def __init__(self,
                 database: Union[QSqlDatabase],
                 config_dict: dict
                 ):
        super(ICmediaGui, self).__init__()
        super(ICmeiaPlayStyle, self).__init__(config_dict)

在例子2中,ICmeiaPlayStyle类内部是没有super的,仅仅是初始化

,所以在ICmediaGui对该类的继承中,需要super该类才能直接使用里面定义好的变量,或者ICmeiaPlayStyle.变量名调用也可以,我个人理解例子2中的

        super(ICmediaGui, self).__init__()
        super(ICmeiaPlayStyle, self).__init__(config_dict)

代码实际上是,QMainWindow是继承的QWidget,所以顺序是

        super(ICmediaGui, self).__init__()
        super(QWidget, self).__init__()
        super(ICmeiaPlayStyle, self).__init__(config_dict)

super(ICmediaGui, self).__init__() 初始化QMainWindow类

super(QWidget, self).__init__() 初始化ICmeiaPlayStyle类

super(ICmeiaPlayStyle, self).__init__(config_dict)  初始化SecondaryPLFCModule类,而其他类如

SecondaryTOPMLudule,
SecondaryTPCDModule,
SecondaryUSERModule 不带有参数且已经内部super了,所以直接继承即可。

 如果当ICmeiaPlayStyle类已经内部super过了呢,加上代码

结果执行报错: 

SecondaryPLFCModule.__init__() missing 1 required positional argument: 'config_dict'

??, 这参数不是明明放进去了吗,作为小白百思不得其解。

后来想到一个可能,

 以自定义的方法举例,当参数没有默认值时,需要往前放,已经有默认参数的往后放,否则会报错。回到之前的问题,那么既然ICmeiaPlayStyle类已经内部super并且只有一个self参数(继承时默认会给一个self的参数,所以一定意义上算无参数)

那么把该类顺序往后调呢,那么SecondaryPLFCModule顺序变成了在QMainWindow之后,那么如何继承?,很简单,回到之间的话-> QMainWindow是继承的QWidget,那么可以这么继承

class ICmediaGui(QMainWindow,
                 SecondaryPLFCModule,
                 ICmeiaPlayStyle,
                 SecondaryTOPMLudule,
                 SecondaryTPCDModule,
                 SecondaryUSERModule,
                 ):

    LYRICFORMAT = ['lrc', None, 'txt']
    MainClick = pyqtSignal(bool)
    ExitClick = pyqtSignal(bool)
    MediaList_UpdateFlag = pyqtSignal(MediaListCutType)
    MediaVideo_SpaceFlag = pyqtSignal(bool)
    Top_Visit_OccaConnect = pyqtSignal(bool)
    Top_DriverVisit_OccaConnect = pyqtSignal(bool)
    Top_Drodown_OccaConnect = pyqtSignal(bool)
    Account_Exit_OccaConnect = pyqtSignal(bool)
    media_record = logger
    Centra_ListWidget_Width = 260
    _enumatate_gcut = MediaListCutType.GeneralCut
    _enumatate_gadd = MediaListCutType.GeneralJustAddup
    _enumatate_mcut = MediaListCutType.MusicCut
    _enumatate_madd = MediaListCutType.MusicJustAddup
    _enumatate_vcut = MediaListCutType.VideoCut
    _enumatate_vadd = MediaListCutType.VideoJustAddup
    def __init__(self,
                 database: Union[QSqlDatabase],
                 config_dict: dict
                 ):
        super(QWidget, self).__init__(config_dict)
        或者
        SecondaryPLFCModule.__init__(self, config_dict)

完美运行,需要注意的一点是如果习惯写成

super(ICmediaGui, self).__init__()
SecondaryPLFCModule.__init__(self, config_dict)

这样的话,需要给QMainWindow一个父类self,或者None,很诡异

 super(ICmediaGui, self).__init__(None/self)
SecondaryPLFCModule.__init__(self, config_dict)

1--------------------------------------------第2点注意事项在例子1的问题修复中说明

回到例子1,其中QrcodeStyle内部没有super,  AnalysisStyle内部已经super,所以在下列代码中我补上了super没问题吧(QRcodeInterface内部已经初始化了,此时如果使用QRcodeInterface进行super定位下一个类并初始化的话,是无法初始化到下一个类的,见下图)

所以写法可以这么写

class AnalysisInterface(QMainWindow,
                        PackInterface,
                        QRcodeInterface,
                        QrcodeStyle,
                        AnalysisStyle
                        ):
    general_refister_count = 3
    ExitClick = pyqtSignal(bool)
    MainClick = pyqtSignal(bool)
    StickThreadConnect = pyqtSignal(bool)
    AnalysisThreadConnect = pyqtSignal(bool)
    UnicodeThreadConnect = pyqtSignal(bool)
    C2aThreadConnect = pyqtSignal(bool)
    A2cThreadConnect = pyqtSignal(bool)
    ExExThreadConnect = pyqtSignal(bool)
    ExDirThreadConnect = pyqtSignal(bool)
    FileCopyThreadConnect = pyqtSignal(bool)
    XmaindExtractThreadConnect = pyqtSignal(bool)
    PackThreadConnect = pyqtSignal(bool)
    def __init__(self,
                 database:QSqlDatabase,
                 config_dict:dict
                 ):
        super(QWidget, self).__init__(config_dict)
        QrcodeStyle.__init__(self)

运行结果:

 ??,啥情况,Centra_Listwidget_Stl的样式丢失了,该样式属于AnalysisStyle类的,而AnalysisStyle类已经super过了啊,直接把常量拿来用没问题的,可是为什么报了这个错呢,个人理解,super继承就是一条链式反应:

正常顺序执行是没错的,再来缕下

QMainWindow -> PackInterface ->  QRcodeInterface  -> QrcodeStyle

super(QMainWindow , self).__init__() 继承自QWidget,下一个类为QWidget,则该代码初始化QWidget,触发QWidget的super代码,执行下一个类

super(QWidget, self).__init__() 已初始化QWidget类,下一个类为PackInterface,初始化PackInterface,PackInterface已经内部super,则执行下一个类

super(PackInterface, self).__init__() 已初始化PackInterface类,下一个类为QRcodeInterface,初始化QRcodeInterface,QRcodeInterface已经内部super,则执行下一个类

super(QRcodeInterface, self).__init__()  已初始化QRcodeInterface类,下一个类为QrcodeStyle,初始化QrcodeStyle,QrcodeStyle内部并没有super,链条断了,不再执行下一个类

super(QrcodeStyle, self).__init__()  上面已经提到,QRcodeInterface已经内部super了,所以QrcodeStyle不能用super(QRcodeInterface, self).__init__()的写法来写了,只能使用:QrcodeStyle.__init__(self)方法来进行初始化,但该方法不具备super的链式反应,即AnalysisStyle实际上只是继承了,但是常量没有继承过来,只能实例化AnalysisStyle.然后进行调用

解决办法: 初始化AnalysisStyle类

         super(QWidget, self).__init__(config_dict)
         QrcodeStyle.__init__(self)

改为,两个写法都行

super(QWidget, self).__init__(config_dict) / PackInterface.__init__(self, config_dict)
        QrcodeStyle.__init__(self)
        AnalysisStyle.__init__(self)

当然,QrcodeStyle内部加个super的话,直接像下面这样给PackInterface个参数就行了

    def __init__(self,
                 database:QSqlDatabase,
                 config_dict:dict
                 ):
        PackInterface.__init__(self, config_dict)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值