重写父类方法时,异常信息 500 20111。附:继承父类并重写的三种方式。

本文记录了一次在登录合并购物车功能开发过程中遇到的AttributeError异常,并详细分析了解决过程及原因,包括如何正确地使用super关键字来调用父类方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

异常信息:     

        刚刚编辑完登录合并购物车的代码,测试时报了500,并抛出异常信息:

AttributeError: 'UserAuthorizeView' object has no attribute 'data'

       眼睛一闭就知道是刚才代码写错了。

        下面是出错的代码:

class UserAuthorizeView(ObtainJSONWebToken):
    # 重写父类post方法,插入合并购物车方法
    def post(self, request, *args, **kwargs):
        # 继承父类post方法,保证购物车登录功能正常
        response = super(UserAuthorizeView, self).post(self, request, *args, **kwargs)

        # 取得user
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():
            user = serializer.object.get('user') or request.user

            # 调用合并购物车方法,并用response接收返回值
            response = merge_cart_cookie_to_redis(request=request, user=user, response=response)
        # 将结果返回
        return response

        红色标识为出错的地方。  

        因为所作的是登录合并购物车功能,所以要考虑在用户点击登录时就将两类购物车数据进行合并。但是项目中实现用户登录时使用的时JWT自带的功能模块,所以需要对源码进行继承和重写。

        经过头皮发麻的排bug过程,终于在继承的过程中找出了问题。

排bug过程

        异常信息显示该类没有data属性,证明在往序列化器中传参时出现了错误,要么多了,要么少了。而我继承的父类中已明确了所需要的参数信息,所以将目标锁定在第五行。原来是所写的继承语法有问题,删掉self即可。

出错原因:

        因为当时继承了ObtainJSONWebToken,并且对父类的post方法进行重写,而父类的post方法中已经写明了参数,所以就一口气复制粘贴,将所有参数都粘贴到super语法中。但是,我忘记了一个致命点,那就是:单继承时,不能将参数全部传递,只能传递父类方法所需的参数,否则会报错

继承父类并重写的三种方式:
当子类继承父类,重写父类方法后,仍想调用父类方法,有以下三种公式:
    (1)父类名.同名方法名(self)                    
    (2)super(子类名,self).同名方法名()

    (3)是对(2)的简写:super().同名方法名()     

        super调用:多继承时,可以将所有父类方法执行一次,并且需要将参数全部传递。单继承时,不能将参数全部传递,只能传递父类方法所需的参数,否则会报错。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值