Python 中的 Mixin 类

Manav Narula 2023年1月30日
  1. 使用 Mixins 解决 Python 中的多重继承问题
  2. 在 Python 中使用 Mixins 增加类的方法
Python 中的 Mixin 类

Python 是一种面向对象的语言。继承是一个重要的特性,它允许一个类的对象继承另一个类的变量和方法。

与 Java 和 C# 不同,Python 支持多重继承。我们可以在多重继承中从多个基类派生特征。

多重继承似乎是一个非常有用的功能,但会导致代码中的很多歧义。与多重继承相关的一个常见问题是菱形依赖问题。

举个例子可以更好地理解这个问题。假设我们有两个类,X 和 Y 继承自 A,Z 继承自 X 和 Y。

某些类 A 方法被 X 和 Y 而不是 Z 覆盖,因此该类确实继承了 X 或 Y。Python 中的 C3 线性化算法在某种程度上对此有所帮助。

使用 Mixins 解决 Python 中的多重继承问题

Mixin 就是这样一种特性,它有助于执行高效且可理解的多重继承,避免菱形依赖问题。我们将在本教程中演示 mixins 的使用。

mixin 类设计模式避免了与多重继承相关的歧义。它用于创建定义单个方法的类。

这些只是为了被继承而不是实例化。当我们在许多其他类中使用特定类功能时会使用这些。

class base(object):
    def fun(self):
        print("fun() base")


class mixin_1(object):
    def fun(self):
        print("fun() mixin 1")


class mixin_2(object):
    def fun(self):
        print("fun() mixin 2")


class child(mixin_2, mixin_1, base):
    pass


ob = child()
ob.fun()

输出:

fun() mixin 2

在 Python 中,mixin 类不会覆盖来自其他 mixin 和基类的方法。此外,类层次结构是从左到右的。

这就是为什么在上面的示例中调用了类 mixin_2 中的 fun() 函数的原因。

在 Python 中使用 Mixins 增加类的方法

Mixins 也可以实现一个使用类中未定义的函数的方法。

此方法不涉及任何多重继承,但旨在增加类的功能。这个类也将只作为其他类的基类。

class mixin_class(object):
    def __ne__(self, val):
        return not (self == val)

    def __lt__(self, val):
        return self <= val and (self != val)

    def __gt__(self, val):
        return not self <= val

    def __ge__(self, val):
        return self == val or self > val


class num_class(mixin_class):
    def __init__(self, i):
        self.i = i

    def __le__(self, val):
        return self.i <= val.i

    def __eq__(self, val):
        return self.i == val.i


print(num_class(10) < num_class(51))
print(num_class(3) != num_class(2))
print(num_class(5) > num_class(2))
print(num_class(5) >= num_class(3))

输出:

True
True
True
True

在上面的例子中,我们创建了 mixin_class 来提供比较整数的函数,即使它没有声明 __le____eq__ 函数。

请记住在使用比较运算符时使用带有 __ 的魔术函数进行比较。

由于它们能够添加新功能,mixin 类的工作方式类似于 Python 中的装饰器。

但是,应该记住,两者都有不同的用途,因为装饰器主要修改类中已经存在的方法。

Mixin 也会与抽象类和接口等其他特性混淆。与 mixins 不同,抽象类需要一个或多个抽象方法。

接口只包含抽象方法。上述三个特性的主要共同点是它们没有被实例化,这意味着它们不能独立存在。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn