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