新闻中心
Python多重继承中super()行为解析与__init__方法调用最佳实践

本文深入探讨Python多重继承中`super()`函数在`__init__`方法调用时遇到的常见问题,特别是当方法解析顺序(MRO)导致意外行为时。通过分析一个具体的TypeError案例,文章提供了两种显式初始化父类的方法,并进一步推荐了使用`super()`与`**kwargs`实现协作式多重继承的最佳实践,确保代码的健壮性和可维护性。
理解Python中的super()与方法解析顺序(MRO)
在Python中,super()函数是实现多重继承和协作式(cooperative)继承的关键工具。它允许子类调用父类的方法,但其行为并非简单地调用“直接父类”的方法。相反,super()根据类的方法解析顺
序(Method Resolution Order, MRO)来确定要调用的下一个方法。MRO是一个类继承链的线性化表示,可以通过ClassName.__mro__属性查看。
当我们在多重继承的场景下使用super().__init__()时,如果不理解MRO的工作原理,很容易遇到意料之外的TypeError。
考虑以下示例代码,它定义了一个Vehicle基类,以及LandVehicle和SeaVessel两个子类,最后是一个同时继承自LandVehicle和SeaVessel的HoverCraft类:
易标AI
告别低效手工,迎接AI标书新时代!3分钟智能生成,行业唯一具备查重功能,自动避雷废标项
135
查看详情
class Vehicle:
def __init__(self, name, maxPassengers, maxSpeed):
self.name = name
self.maxPassengers = maxPassengers
self.maxSpeed = maxSpeed
def display(self):
print('Ten phuong tien:', self.name)
print('So hanh khach toi da:', self.maxPassengers)
print('Toc do toi da:', self.maxSpeed)
class LandVehicle(Vehicle):
def __init__(self, name, maxPassengers, maxSpeed, numWheels, drive):
super().__init__(name, maxPassengers, maxSpeed) # 问题所在
self.numWheels = numWheels
self.drive = drive
def display(self):
# 为了避免重复打印,这里只打印LandVehicle特有的属性
super().display()
print('Banh xe:', self.numWheels)
print('Ghe lai:', self.drive)
class SeaVessel(Vehicle):
def __init__(self, name, maxPassengers, maxSpeed, displacement, launch):
super().__init__(name, maxPassengers, maxSpeed) # 问题所在
self.displacement = displacement # 修正拼写错误
self.launch = launch
def display(self):
# 为了避免重复打印,这里只打印SeaVessel特有的属性
super().display()
print('Trong luong:', self.displacement)
print('Xuat diem:', self.launch)
class HoverCraft(LandVehicle, SeaVessel): # 多重继承
def __init__(self, name, maxPassengers, maxSpeed, numWheels, drive, displacement, launch, enterLand, enterSea):
# 显式调用父类构造器,这是导致问题的根源之一
LandVehicle.__init__(self, name, maxPassengers, maxSpeed, numWheels, drive)
SeaVessel.__init__(self, name, maxPassengers, maxSpeed, displacement, launch)
self.enterLand = enterLand
self.enterSea = enterSea
def display(self):
# 协作式显示,避免重复
super().display()
print('Vao dat:', self.enterLand)
print('Vao bien:', self.enterSea)
# 实例化并测试
v5 = HoverCraft('moto nuoc', 2, '80km/h', 0, 1, 10, '2h', '6h', '17h')
v5.display()运行上述代码,会得到一个TypeError:
TypeError: SeaVessel.__init__() missing 2 required positional arguments: 'displacement' and 'launch'
错误分析:MRO如何导致TypeError
这个错误发生在LandVehicle.__init__内部调用super().__init__(name, maxPassengers, maxSpeed)时。为了理解这一点,我们需要查看HoverCraft的MRO:
print(HoverCraft.__mro__) # 输出: (<class '__main__.HoverCraft'>, <class '__main__.LandVehicle'>, <class '__main__.SeaVessel'>, <class '__main__.Vehicle'>, <class 'object'>)
当HoverCraft实例被创建时,其__init__方法显式调用了LandVehicle.__init__。在LandVehicle.__init__内部,super().__init__()被调用。此时,super()会根据HoverCraft的MRO,在LandVehicle之后查找下一个类。根据MRO,LandVehicle之后的类是`Sea
以上就是Python多重继承中super()行为解析与__init__方法调用最佳实践的详细内容,更多请关注其它相关文章!
# 量计算
# 鲜花外卖关键词排名
# 天桥区营销推广制度
# 正规网站建设作用
# 衡水网站建设基本流程
# 德国餐厅如何推广营销
# seo怎样自学
# 职场智慧营销推广方案
# 余姚网站建设银行电话
# 安阳市网站制作推广方案
# 麻涌seo优化价格
# 很容易
# 两种
# python
# 这是
# 运算符
# 线性化
# 为了避免
# 特有的
# 是一个
# 子类
# red
# 常见问题
# ai
# 工具
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
HTML长属性值处理:表单action路径优化与代码规范应对
J*aScript map 方法中处理循环元素为空数组的策略
谷歌学术网站直达地址 谷歌学术搜索网页版一键进入
优化大型XML文件解析:基于Python流式处理的内存高效方案
outlook中文官网入口地址 outlook官方中文版直达首页链接
Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025
在Socket.IO连接中实现Access Token自动更新与动态重连
C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用
如何在CSS中使用浮动制作导航栏_float实现水平菜单
MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId
漫蛙2在线漫画入口 漫蛙正版漫画网页版直达
c++如何使用Meson构建系统_c++比CMake更快的构建工具
192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台
《刺客信条:影》PS5 Pro和Switch 2画面对比
Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖
PostgreSQL海量数据高效导入策略:Python与Django实践指南
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决
TikTok评论显示延迟如何处理 TikTok评论刷新优化方法
Go语言HTML解析:利用Goquery精准获取指定元素内容
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
J*aScript中赋值与自增运算符的复杂交互与执行机制
Go语言中动态执行代码字符串的策略与实践
Steam官网入口直达 Steam注册及登录步骤
韩小圈电脑版在线入口_网页版免费登录地址
知音漫客正版漫画平台_知音漫客官网账号登录
Golang并发任务中错误如何聚合_Golang goroutine error收集方式
J*aScript动态修改指定div内所有a标签样式指南
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
R星幕后开发视频泄露 包含《GTA6》等多款大作
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
qq音乐在线播放入口_qq音乐电脑版登录链接
火锅吃太多会怎样 火锅吃太多会上火吗
微信网页版登录教程_微信网页版登录入口在哪
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法
快手官方唯一登录入口 谨防山寨钓鱼网站
PHP中SSG-WSG API的AES加密实践:正确使用初始化向量
知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
解决Python logging 中 datefmt 导致时间戳固定不变的问题
Excel Power Pivot如何处理XML数据源 构建高级数据模型
CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略
Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】
小米14应用无法联网原因分析_小米14网络权限修复
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法
响应式容器内容自动缩放与宽高比维持教程
Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】


2025-11-09
浏览次数:次
返回列表