混音与继承

2024-04-19 05:54:42 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

Mix-in通常用于多重继承。所以,从这个意义上说,没有“区别”。

细节是Mix-in作为一个独立的对象很少有用。

例如,假设您有一个名为“coloranddimmension”的混合,它添加了一个颜色属性以及宽度和高度。

现在,您可以将color和dimension添加到Shape类、Sprite类、Car类等,它们都将具有相同的接口(比如get/setColor、get/setHeight/Width等)

所以,在一般情况下,Mix-in就是继承。但是,您可以争辩说,对于Mix in是“主要”类还是简单的mixin,这是类在整个域中的角色问题。

编辑——只是为了澄清。

是的,在当今的现代术语中,Mix-In可以被认为是一个带有相关实现的接口。它实际上只是使用一个普通的、旧的、日常的类进行普通的、旧的、日常的多重继承。只是碰巧是MI的一个具体应用。大多数语言在任何特殊情况下都不提供Mix,它只是一个被设计为“mixed In”的类,而不是单独使用的类。

mix-in是用于实现目的的(多重)继承的一种特定的受限情况;某些语言(例如Ruby)支持它,而不支持通用多重继承。

What is the difference between a mixin and inheritance?

mix in是一个基类,您可以从它继承来提供附加功能。伪代码示例:

class Mixin:
    def complex_method(self):
        return complex_functionality(self)

名称“mix-in”表示要与其他代码混合。因此,推论是您不会单独实例化mix-in类。以下对象没有数据,实例化它以调用复杂的方法是没有意义的。(在这种情况下,您也可以只定义函数而不是类。)

>>> obj = Mixin()

mix-in经常与其他基类一起使用。

因此,mixin是继承的子集或特例。

与单一继承相比,使用mix-in的优势在于,您可以一次性为该功能编写代码,然后在多个不同的类中使用相同的功能。缺点是,您可能需要在使用该功能的地方以外的其他地方查找该功能,因此通过将其保持在附近来减轻这种缺点是好的。

我个人发现在单一继承中使用混合是必要的,我们正在对许多相似的代码进行单元测试,但是测试用例是基于它们对一个基本用例的继承而实例化的,并且保持代码在手边(在同一个模块中)的唯一方法是继承自对象,而不干扰覆盖率数字使子用例同时从通用测试用例库和只应用于它们的自定义库继承。

Mixins与抽象基类的比较

两者都是不打算实例化的父类的一种形式。

mixin提供功能,但无法直接使用。用户打算通过(子)类使用它。

抽象基类提供了一个接口,但没有可用的功能。用户打算创建接口调用的功能。

class Abstraction(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def complex_method(self):
        return complex_functionality(self)

在这里,您无法实例化此对象,因为它需要一个子类来实现具有具体方法的功能(尽管您可以从super()访问其中的功能):

>>> obj = Abstraction()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Abstraction with
abstract methods complex_method

在Python中,abc模块中的一些类是父类的示例,它们通过继承和抽象接口提供功能,而这些接口必须由子类实现。这些想法并不相互排斥。

摘要

简单地说,mix-in只是一个基类,您不会单独实例化它,通常在多重继承中用作辅助基类。

相关问题 更多 >