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 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