Metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

Python: 虚拟类用到弹窗UI界面做继承实现时,报以下错误 :

class Ui_Dialog(QDialog, RunTimeCallBack):

# RunTimeCallBack.class
    def notify(self, msgType, postname):
        # 更新SN, SOC
        print(f"哈哈,PopDialog收到别人的通知了{postname=}")

    # RunTimeCallBack.class
    def timeUpdate(self, device_index, run_state, startime):
        # 更新测试时间
        mLogger.debug(f"收到计时器更新 ,{device_index=},{run_state=} ,={startime}")
        pass
#。。。。
#。。。。


class RunTimeCallBack(Subscriber):

    # def notify(self):
    #     pass

    @abstractmethod
    def timeUpdate(self,device_index,run_state,startime):  # 用于更新Dialog显示测试时间
        pass

class Subscriber(metaclass=ABCMeta):

    def __init__(self):
        pass

    @abstractmethod
    def notify(self):
        pass

Traceback (most recent call last):
  File "/Users/gdlocal/Documents/Lani_work/T03/T03/t03Gui/mainT03HSUi.py", line 5, in <module>
    from DeviceItem import T03DeviceWindow
  File "/Users/gdlocal/Documents/Lani_work/T03/T03/t03Gui/DeviceItem.py", line 8, in <module>
    from PopDialog import Ui_Dialog
  File "/Users/gdlocal/Documents/Lani_work/T03/T03/t03Gui/PopDialog.py", line 84, in <module>
    class Ui_Dialog(QDialog, RunTimeCallBack):
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

原因:

说是元类冲突,

目前暂时的解决方法是:

原来父类,类声明:class Subscriber(metaclass=ABCMeta):

现在修改一下,直接继承object:

class Subscriber(object):

        __metaclass__ = ABCMeta  #虚拟类的声明在代码块声明,

#class Subscriber(metaclass=ABCMeta):
class Subscriber(object):
    __metaclass__ = ABCMeta

    def __init__(self):
        pass

    @abstractmethod
    def notify(self):
        pass

但是

************************************************************************

Python3.0到Python3.3,必须在class语句中使用metaclass=ABCMeta;

在python2中使用时。这个报错,说明定义正确,生效了。

Python2中使用__metaclass__=ABCMeta

***************************************************************

说明上面的__metaclass__ = ABCMeta,没有实现作用。

参考:关于python类继承中metaclass conflict的处理_大文格格的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值