python学习-mixin类

概述

在看到django-rest-framework的源码的时候,发现使用了mixin类。这里进行一点简单的总结,方便复习

源码

在rest_framework/mixin.py里面,有这么一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class ListModelMixin(object):
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())

page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)

serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)

其中,self.filter_queryset(self.get_queryset()) 这个函数是在这个类里面并没有定义,同时,这个类也没有继承其他函数,经过查看,这个函数存在于 GenericAPIView,说明是复用于GenericAPIView。

自己的理解:

我们写两个类,一个stu类,一个peo类

stu类,做为mixin类

1
2
3
4
5
# stu.py
class StuMixin(object):
def methodtest(self):
res = self.print_str()
print(res)

peo类,做为父类

1
2
3
class People(object):
def print_str(self):
return "I am a people"

实例类,做为实例类

1
2
3
class Instancetest(StuMixin,People):
def main(self):
self.methodtest()

运行

1
2
3
4
5
6
if __name__ == "__main__":
i = Instancetest()
i.main()

# 打印出
I am a people

说明stu类虽然没有定义方法,但是它直接使用了peo类的方法,这个或许就是mixin类的一大特点。其基础功能由父类实现。 自己主要实现搭建在这些基础功能之上的功能

举个例子:

django—rest模块,ListModelMixin模块主要实现数据库检索数据并展示出来,其基础的数据库检索等功能统统是由一个具体的父类实现的。自己只进行组合,这样代码虽然有耦合,但是功能上分得很清楚,基础功能只由父类去做,组合由mixin类进行组合。

进一步拓展

假如,你有两个父类: people1,people2。那么

1
2
3
4
5
6
7
8
9
10
11
12
class People(object):
def print_str(self):
return "I am a people"

class People2(object):
def print_str(self):
return "I am a people2"

class Instancetest(StuMixin,People,People2):
def main(self):
self.methodtest()
打印出来的是 i am people。

说明哪个先出现,就继承哪个的方法