news 2026/6/6 19:45:00

Python多继承之super()继承问题解决

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python多继承之super()继承问题解决
  • 在继承问题之前先来了解下:super是什么?(后面继承代码会用到)
    • 严格来说:super () 不是方法,它是一个!是用来创建代理对象的内置类!
    • super() 是 Python 内置的类(class),调用 super() 其实是在 创建一个super 对象
      # 来看下这个是什么意思?super().__init__()# 1.super() 创建一个代理对象# 2.这个对象自动帮你找到父类# 3.然后调用父类的 __init__ 方法

接下来进入正题,看下面代码为什么会报错?

# 爷爷类:基础用户(所有用户都有的属性)classUser:def__init__(self,username,password):self.username=username self.password=password# 父类1:会员用户classMemberUser(User):def__init__(self,username,password,vip_level):# 注意这里的 super() 会自动按 MRO 顺序调用super().__init__(username,password)self.vip_level=vip_level# 父类2:管理员用户classAdminUser(User):def__init__(self,username,password,role):# 注意这里的 super() 会自动按 MRO 顺序调用super().__init__(username,password)self.role=role# 子类:超级用户(多继承 → 既是会员,又是管理员)classSuperUser(MemberUser,AdminUser):def__init__(self,username,password,vip_level,role):# 手动初始化两个父类MemberUser.__init__(self,username,password,vip_level)AdminUser.__init__(self,username,password,role)super_user=SuperUser('test','123456','3','test_user')

报错信息:TypeError: AdminUser.init() missing 1 required positional argument: ‘role’。AdminUser类 为什么会缺少一个位置参数呢?

  • 第一步:我们从头开始捋
    • 代码从实例化 SuperUser 子类开始
    • SuperUser 又是多继承
    • 那么我们来看 SuperUser 子类的mro顺序,也就是继承的顺序,也就是super() 代理对象的顺序,这个很关键!
    # 以下两种打印方式都可以# print(SuperUser.__mro__) # 这种打印出来是元组print(SuperUser.mro())# 这种打印出来是列表,这里用这个了# 打印结果:# [<class '__main__.SuperUser'>, <class '__main__.MemberUser'>, <class '__main__.AdminUser'>, <class '__main__.User'>, <class 'object'>]# 这里继承的顺序很关键:SuperUser -- MemberUser -- AdminUser -- User -- object
  • 第二步:我们知道了继承的顺序,先是 SuperUser 本身,这里没什么问题,然后是MemberUser ,再然后是AdminUser… 此时我们来看下MemberUser中的代码!
    # 父类1:会员用户classMemberUser(User):def__init__(self,username,password,vip_level):# 注意这里的 super() 会自动按 MRO 顺序调用super().__init__(username,password)self.vip_level=vip_level# mro继承顺序很关键:SuperUser -- MemberUser -- AdminUser -- User -- object
    • 问题关键:
      • 来看下上面代码的super()
      • 我们的本意是要让他调用 User 爷爷类的初始化方法
      • 但是现在按照mro顺序实际找的是 MemberUser 下一个类,也就是AdminUser
      • 相当于这里的 super() 调用的是 AdminUser 类中的 初始化方法
      • AdminUser 中的__init__需要三个参数,但是 MemberUser 中 super() 调用的时候传了两个,所以缺少了一个参数,所以报错了
        # 父类2:管理员用户classAdminUser(User):def__init__(self,username,password,role):# 注意这里的 super() 会自动按 MRO 顺序调用super().__init__(username,password)self.role=role
  • 第三步:解决问题
    • 通过父类名方式调用父类方法,让 MemberUser 和 AdminUser 中的 super() 去找 User
  • 第四步:解决后的完整代码
    # 爷爷类:基础用户(所有用户都有的属性)classUser:def__init__(self,username,password):self.username=username self.password=password# 父类1:会员用户classMemberUser(User):def__init__(self,username,password,vip_level):# 注意这里的 super() 会自动按 MRO 顺序调用# super().__init__(username, password)# 将这里的 super() 改为 User, 注意改成这种方式后,要传递selfUser.__init__(self,username,password)self.vip_level=vip_level# 父类2:管理员用户classAdminUser(User):def__init__(self,username,password,role):# 注意这里的 super() 会自动按 MRO 顺序调用# super().__init__(username, password)# 将这里的 super() 改为 User, 注意改成这种方式后,要传递selfUser.__init__(self,username,password)self.role=role# 子类:超级用户(多继承 → 既是会员,又是管理员)classSuperUser(MemberUser,AdminUser):def__init__(self,username,password,vip_level,role):# 手动初始化两个父类MemberUser.__init__(self,username,password,vip_level)AdminUser.__init__(self,username,password,role)super_user=SuperUser('test','123456','3','test_user')
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 19:43:30

Multisim直流工作点分析:从原理到实战,精准调试放大电路静态工作点

1. 从“静态”说起&#xff1a;为什么直流工作点分析是电路设计的基石刚入行画电路图那会儿&#xff0c;最怕的就是仿真结果出来&#xff0c;波形不是削顶就是截止&#xff0c;放大倍数也跟预想的差一大截。后来被师傅点醒&#xff0c;问题十有八九出在“静态工作点”没调对。所…

作者头像 李华
网站建设 2026/6/6 19:43:29

Allegro PCB丝印字体管理:从Text Block设置到批量修改实战

1. 项目概述&#xff1a;为什么我们需要关注PCB设计中的字体管理在PCB设计的全流程中&#xff0c;丝印层&#xff08;Silkscreen&#xff09;的布局与标注&#xff0c;常常被工程师们视为“收尾工作”或“美化步骤”&#xff0c;从而在项目后期被匆匆处理。然而&#xff0c;一张…

作者头像 李华
网站建设 2026/6/6 19:43:09

论文反复修改到心累?资深教授推荐这几个AI写作辅助软件

论文反复修改到心累&#xff1f;选题难、写不快、改不完&#xff0c;是很多学生共同的困扰——用对AI工具、走对流程&#xff0c;才能真正提升效率。资深教授普遍推荐&#xff1a;千笔AI&#xff08;中文全流程首选&#xff09; 豆包学术版&#xff08;轻量高效&#xff09; De…

作者头像 李华
网站建设 2026/6/6 19:43:05

暗黑破坏神2存档编辑器:可视化修改角色与物品的终极工具

暗黑破坏神2存档编辑器&#xff1a;可视化修改角色与物品的终极工具 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor d2s-editor是一款专为《暗黑破坏神2》玩家设计的开源存档编辑工具&#xff0c;它将复杂的二进制存档数据转化为…

作者头像 李华
网站建设 2026/6/6 19:38:39

告别仿真!手把手教你用ADC0809和51单片机搭建一个真实的八通道电压采集器(附完整代码和PCB)

从仿真到实战&#xff1a;基于ADC0809的八通道电压采集系统全流程开发指南在电子设计领域&#xff0c;仿真与实物制作之间往往存在一道看不见的鸿沟。许多学习者在Proteus中能够完美运行的电路&#xff0c;一旦转移到实际硬件平台就会遇到各种意想不到的问题。本文将聚焦ADC080…

作者头像 李华
网站建设 2026/6/6 19:38:00

某省1970–1987年工农业与运输业产值关系的MATLAB回归实操包

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;用真实省级时间序列数据&#xff08;1970–1987年&#xff09;做工农业产值、固定资产投资、人口对运输业产值影响的多元线性回归分析。主脚本02a 多元线性回归分析.m一键运行&#xff0c;自动完成数据读取、变…

作者头像 李华