概述
在看到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。
说明哪个先出现,就继承哪个的方法