支持合作多基因遗传
协同多继承是一种实现类的技术继承多个超级类-通常是一个主超级类和一个或多个添加额外行为的mixin类。它可以方便地添加新的稍后混合以进一步扩展行为,而无需更改类的实现或创建的任何现有代码类的实例。
该技术要求所有超类__初始化__
方法如下它们处理未识别的关键字参数和使用super()
调用他们自己的超类__初始化__
方法。
PyQt5的类遵循此模式。
见雷蒙德·赫廷格Python的super()被认为是super!博客发布更多关于该主题的背景信息。
例如,假设我们有一个表示人的类这个人有名字。以下可能是初步实施:
班 人(Q对象):
定义 __初始化__(自己, 名称, 起源=无)
Q对象.__初始化__(自己, 起源)
自己.名称 = 名称
实例通常会通过以下方式之一创建:
人 = 人(“乔”)
人 = 人(“乔”, 一些家长)
这种方法有一些局限性:
考虑这个替代实现:
班 人(Q对象):
定义 __初始化__(自己, 名称, **千瓦时):
超级的().__初始化__(**千瓦时)
自己.名称 = 名称
区别在于我们只处理人
类本身,我们通过打电话super()
.
使用此实现,通常会在以下方式:
人 = 人(“乔”)
人 = 人(“乔”, 起源=一些家长)
这里的区别是,我们使用关键字参数来指定任何不由处理的参数人
类本身。请注意,我们可以对所有参数使用关键字参数-无论您是否这样做这取决于个人选择。
第一个实现的限制不再适用。例如,无需进一步更改,我们也可以这样做:
假设我们现在想扩展人
通过添加类调节一个人年龄的混合物。mixin的实现将是如下:
班 年龄(对象):
定义 __初始化__(自己, 年龄=0, **千瓦时):
超级的().__初始化__(**千瓦时)
自己.年龄 = 年龄
这与我们的人
实施,但要注意我们已经提供了年龄
参数的默认值。
以下是我们的新产品人
实施:
班 人(Q对象, 年龄):
定义 __初始化__(自己, 名称, **千瓦时):
超级的().__初始化__(**千瓦时)
自己.名称 = 名称
我们唯一要做的改变就是增加年龄
到人
的列表超等级。更重要的是,我们不需要更改任何调用来创建人
实例。
如果我们确实想创建人
实例具有非默认年龄,则我们只需将其作为关键字参数传递,如下所示:
这种技术增加了关键字参数的使用,而这意味着有点输入越多,它显著提高了应用程序代码的可读性。