类的继承派生&&重写
1.继承的定义: 被继承的父类必须放在字类上面
python中一个子类可以继承多个父类
继承是创建类的一种方式,新建的类称为字类或派生类,继承的类称为父类或基类
继承的作用: 减少代码冗余
在继承背景下对象属性的查找顺序:对象的名称空间 ---子类的名称空间---父类的名称空间
2. 派生:指的是字类继承父类的方法和属性,并派生出自己独有的属性和方法 ,
若字类中存在与父类相同的方法,则该方法为重写
1. 类继承的两种方式 和 派生
super()为父类对象 可以调用父类的属性和方法
# 继承__init__方法的两种方式 class OldboyPeople: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex
def simple_method(self):
print('父类的方法')
class Teacher(OldboyPeople): def __init__(self,name,age,sex,salary): # OldboyPeople.__init__(self,name,age,sex) # 第一种方式 父类名.__init__的方式 必须带上self # self.salary = salary super().__init__(name,age,sex) # 第二种方式: 通过super().__init__的方式 不需要带上self self.salary = salary def change_score(self): # 子类派生出自己的方法 print(f'老师{self.name}修改分数中,工资为{self.salary}。。')
super().simple_method() t = Teacher('tank',17,'female',100) t.change_score()
2. 重写父类方法
例1:基础示例
# 父类 class Foo: def f1(self): print('from Foo.f1...') def f2(self): # self ---> bar_obj print('from Foo.f2...') # bar_obj.f1() ---> 对象自己找 ---> Bar ---> Foo self.f1() # 子类 class Bar(Foo): # 重写 def f1(self): print('from Bar.f1..') def func(self): print('from Bar.func...') bar_obj = Bar() bar_obj.f2() ''' 结果1: from Foo.f2... from Bar.f1... '''
例2:重写drf reponse类的__init__方法
先写自己的__init__方法,然后再调用父类的__init__方法,把修改过的参数,数据 重新传给父类的__init__方法
from rest_framework.response import Response ''' def __init__(self, data=None, status=None, template_name=None, headers=None, exception=False, content_type=None): ''' class APIResponse(Response): def __init__(self, status=0, msg='ok', http_status=None, headers=None, exception=False, **kwargs): # 将外界传入的数据状态码、状态信息以及其他所有额外存储在kwargs中的信息,都格式化成data数据 data = { 'status': status, 'msg': msg } # 在外界数据可以用result和results来存储 if kwargs: data.update(kwargs) super().__init__(data=data, status=http_status, headers=headers, exception=exception)
3.使用
class CarAPIView(APIView): def get(self, request, *args, **kwargs): pk = kwargs.get('pk') if pk: try: car_obj = models.Car.objects.get(pk=pk) car_serializer = serializers.CarModelSerializer(car_obj, many=False) # return Response({ # 'status': 0, # 'msg': 'ok', # 'result': car_serializer.data # }) return APIResponse(result=car_serializer.data) except: # return Response( # data={ # 'status': 1, # 'msg': 'pk error' # }, # status=status.HTTP_400_BAD_REQUEST, # exception=True # ) return APIResponse(status=1, msg='pk error', http_status=400, exception=True) else: car_queryset = models.Car.objects.all() car_serializer = serializers.CarModelSerializer(car_queryset, many=True) # return Response({ # 'status': 0, # 'msg': 'ok', # 'results': car_serializer.data, # }) return APIResponse(results=car_serializer.data)