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