当前位置: 首页 > 面试题库 >

多继承元类冲突

隗轶
2023-03-14
问题内容

我需要一个类的双重继承。我尝试了几种语法,但我不了解元类的概念。

from PyQt5.QtGui import QStandardItem
from configparser import ConfigParser

class FinalClass(ConfigParser, QStandardItem):
    def __init__(self, param):
        ConfigParser.__init__(self)
        QStandardItem.__init__(self)

问题答案:

您遇到的问题是,您尝试从其继承的类具有不同的元类:

>>> type(QStandardItem)
<class 'sip.wrappertype'> 
>>> type(ConfigParser)
<class 'abc.ABCMeta'>

因此,python无法确定哪个应该是新创建的类的元类。在这种情况下,它必须是一个继承自sip.wrappertype(或PyQt5.QtCore.pyqtWrapperType对于较旧的PyQt5版本)和的类ABCMeta

因此,可以通过显式引入诸如metaclass之类的类来解决元类冲突:

from PyQt5.QtGui import QStandardItem
from configparser import ConfigParser

class FinalMeta(type(QStandardItem), type(ConfigParser)):
    pass

class FinalClass(ConfigParser, QStandardItem, metaclass=FinalMeta):
    def __init__(self, param):
        ConfigParser.__init__(self)
        QStandardItem.__init__(self)

如果需要更详细的描述,那么本文是一个好的开始。

但是,我并不真正相信对于这种情况使用多重继承是一个好主意,特别是将多重继承与QObjects一起使用可能会很棘手。也许最好将ConfigParser对象存储为实例变量,并在需要时使用它。



 类似资料:
  • 问题内容: 看起来我偶然发现了一个元类地狱,即使我不想做任何事情。 我正在使用PySide在Qt4中编写一个应用程序。我想将事件驱动的部分与UI定义分开,UI定义是从Qt Designer文件生成的。因此,我创建了一个“ controller”类,但是为了简化我的生活,我还是对它们进行了多重继承。一个例子: 这按预期工作。它也有继承自(,,)。但是,当我子类化并尝试从所述子类继承(代替)时,会收到

  • 在面向对象的程序设计中,定义一个新的 class 的时候,可以从某个现有的 class 继承,新的 class 称为子类,而被继承的 class 称为基类、父类或超类。 Python 中继承的语法如下: class Parent: pass class Child(Parent): pass 在第 1 行,定义了父类 Parent; 在第 4 行,定义了子类 Child,语法

  • 主要内容:多继承下的构造函数,命名冲突在前面的例子中,派生类都只有一个基类,称为 单继承(Single Inheritance)。除此之外, C++也支持 多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、 C#、 PHP 等干脆取消了多继承。 多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A

  • 问题内容: 我已经在BabelJS和MDN(根本没有任何信息)上完成了大部分研究工作,但是请随时告诉我是否在寻找有关ES6Spec的更多信息时不够谨慎。 我想知道ES6是否以与其他鸭子类型语言相同的方式支持多重继承。例如,我可以做类似的事情: 将多个类别扩展到新类别?如果是这样,相对于ClassOne,解释器会更喜欢ClassTwo的方法/属性吗? 问题答案: 一个对象只能有一个原型。通过创建一个

  • 我已经在BabelJS和MDN上完成了大部分研究(根本没有信息),但如果我在寻找有关ES6 Spec的更多信息时不够小心,请随时告诉我。 我想知道ES6是否以与其他鸭子类型语言相同的方式支持多重继承。例如,我可以做这样的事情吗: 要将多个类扩展到新类?如果是这样,解释器会更喜欢类二的方法/属性而不是类一吗?

  • 在面向对象编程中,当我们已经创建了一个类,而又想再创建一个与之相似的类,比如添加几个方法,或者修改原来的方法,这时我们不必从头开始,可以从原来的类派生出一个新的类,我们把原来的类称为父类或基类,而派生出的类称为子类,子类继承了父类的所有数据和方法。 让我们看一个简单的例子,首先我们定义一个 Animal 类: class Animal(object): def __init__(self,