辽阳企业网站建设价格,公司网站建设免费,给网站做cdn,百度分享代码 wordpress为什么需要Mix-in?
在学习面向对象时我们知道#xff0c;类可以通过继承类获得属性和方法#xff0c;通过继承可以减少重复代码、提高复用率。Python支持多继承#xff0c;一个类可以通过继承多个类来得到它们的功能。但多继承会带来一些问题#xff0c;比如属性冲突。那…为什么需要Mix-in?
在学习面向对象时我们知道类可以通过继承类获得属性和方法通过继承可以减少重复代码、提高复用率。Python支持多继承一个类可以通过继承多个类来得到它们的功能。但多继承会带来一些问题比如属性冲突。那么有没有可能只继承类的方法呢 当然方法名称也可能冲突。但如果合理地划分功能的话这种可能性很小。 Mix-in类混入类只定义一些方法给子类使用不定义自己的实例属性也不要求调用它的__init__方法。Mix-in类并不是新的语法只是一种特殊的类只用来提供方法。 在实际的代码中我们经常会看到Mixin结尾的类(如SingleObjectMixin)这是一种命名约定名称其实不会影响功能。 Mix-in 实例
这里借用 通过 Python 理解 Mixin 概念举的例子。
class MappingMixin:def __getitem__(self, key):return self.__dict__.get(key)def __setitem__(self, key, value):return self.__dict__.set(key, value)class Person(MappingMixin):def __init__(self, name, gender, age):self.name nameself.gender genderself.age agep Person(小陈, 男, 18)
print(p[name]) # 小陈
print(p[age]) # 18首先定义了一个Person类然后我们能用字典访问Person于是定义了一个只有方法的MappingMixin类并让Person继承MappingMixin的方法。
另一个例子 python 中Mixin混入类的用法
class Tel:def telfunc(self):print(我可以接打电话)
class SMS:def smsfunc(self):print(我可以发短信)
class Phone(Tel, SMS):def __init__(self, sn):self.sn sn
def welcome(self):print(welcome {}.format(self.sn))
p Phone(xiaomi)
p.telfunc()
p.smsfunc()
p.welcome()Django中的Mix-in
Django中有很多Mixin类。在django.views.generic.base 中存在如下关系 View 是一个基类可以说是一个抽象基类实现了核心功能如dispatch。dispatch委托具体子类的处理方法。 TemplateResponseMixin 为使用模板的视图提供了功能。
RedirectView类只继承 View可以看到它实现了 get、head、post 等方法。 TemplateView 只用于显示内容因此它只实现了 get 方法。由于它需要相关的模板功能所以继承了TemplateResponseMixin。
Django中很多实现都依赖了Mix-in类而我们在使用Django开发的时候也可以利用内置的和自定义的Mix-in类提供功能。 django mixin文档
参考链接
通过 Python 理解 Mixin 概念python 中Mixin混入类的用法《流畅的Python》第12章继承的优缺点《Effective Python》第二版41.考虑使用Mix-in Classes组合功能django mixin文档