支持合作多基因遗传

注释

本节不是关于从多个Qt类进行子分类。

协同多继承是一种实现类的技术继承多个超级类-通常是一个主超级类和一个或多个添加额外行为的mixin类。它可以方便地添加新的稍后混合以进一步扩展行为,而无需更改类的实现或创建的任何现有代码类的实例。

该技术要求所有超类__初始化__方法如下它们处理未识别的关键字参数和使用super()调用他们自己的超类__初始化__方法。

PyQt5的类遵循此模式。

见雷蒙德·赫廷格Python的super()被认为是super!博客发布更多关于该主题的背景信息。

例如,假设我们有一个表示人的类这个人有名字。以下可能是初步实施:

 (Q对象):
    定义 __初始化__(自己, 名称, 起源=)
        Q对象.__初始化__(自己, 起源)

        自己.名称 = 名称

实例通常会通过以下方式之一创建:

 = (“乔”)
 = (“乔”, 一些家长)

这种方法有一些局限性:

  • 只有一个子集Q对象API暴露。对于例如,您不能通过以下方式设置Qt属性的值或连接信号将适当的关键字参数传递给人员__初始化__.

  • 将另一个类添加到的超类列表意味着__初始化__需要更改实现。如果新的mixin需要非可选参数,然后每次调用以创建实例将需要更改。

考虑这个替代实现:

 (Q对象):
    定义 __初始化__(自己, 名称, **千瓦时):
        超级的().__初始化__(**千瓦时)

        自己.名称 = 名称

区别在于我们只处理类本身,我们通过打电话super().

使用此实现,通常会在以下方式:

 = (“乔”)
 = (“乔”, 起源=一些家长)

这里的区别是,我们使用关键字参数来指定任何不由处理的参数类本身。请注意,我们可以对所有参数使用关键字参数-无论您是否这样做这取决于个人选择。

第一个实现的限制不再适用。例如,无需进一步更改,我们也可以这样做:

 = (“乔”, 摧毁=一些可调用的)

假设我们现在想扩展通过添加类调节一个人年龄的混合物。mixin的实现将是如下:

 年龄(对象):
    定义 __初始化__(自己, 年龄=0, **千瓦时):
        超级的().__初始化__(**千瓦时)

        自己.年龄 = 年龄

这与我们的实施,但要注意我们已经提供了年龄参数的默认值。

以下是我们的新产品实施:

 (Q对象, 年龄):
    定义 __初始化__(自己, 名称, **千瓦时):
        超级的().__初始化__(**千瓦时)

        自己.名称 = 名称

我们唯一要做的改变就是增加年龄的列表超等级。更重要的是,我们不需要更改任何调用来创建实例。

如果我们确实想创建实例具有非默认年龄,则我们只需将其作为关键字参数传递,如下所示:

 = (“乔”, 年龄=38)

这种技术增加了关键字参数的使用,而这意味着有点输入越多,它显著提高了应用程序代码的可读性。