类的继承派生&&重写

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)

 

posted @ 2019-11-26 22:10  躺云飘  阅读(229)  评论(0编辑  收藏  举报