当前位置: 首页 > news >正文

第4篇:继承基础——单继承、super()与方法重写

第4篇:继承基础——单继承、super()与方法重写

1. 继承的概念与语法

继承允许创建一个新类(子类)来扩展现有类(父类),子类拥有父类的所有属性和方法,并可以添加新的或修改已有的。

classAnimal:def__init__(self,name):self.name=namedefspeak(self):print(f"{self.name}makes a sound")classDog(Animal):defspeak(self):print(f"{self.name}barks")

Dog(Animal)表示Dog继承自Animal

子类可以重写父类方法。

2. 方法重写(Override)

子类重新定义父类的方法,实现自己的行为。

classCat(Animal):defspeak(self):print(f"{self.name}meows")

调用时,Python会从子类开始查找方法,找到则停止。

a=Animal("generic")d=Dog("Buddy")c=Cat("Kitty")a.speak()# generic makes a soundd.speak()# Buddy barksc.speak()# Kitty meows
3. 使用 super() 调用父类

在子类中,我们常常需要先调用父类的__init__来初始化继承的属性,或者在重写的方法中扩展父类行为。

classEmployee:def__init__(self,name,salary):self.name=name self.salary=salarydefwork(self):print(f"{self.name}is working")classManager(Employee):def__init__(self,name,salary,bonus):super().__init__(name,salary)# 调用父类构造器self.bonus=bonusdefwork(self):super().work()# 先调用父类方法print(f"{self.name}also manages team")

super()返回一个代理对象,用于调用父类的方法。在单继承中,它非常直观。

4. 继承中的属性查找

子类实例访问属性时,顺序是:实例属性 → 子类类属性 → 父类类属性 → 父类的父类… 直到object

classA:x=1classB(A):x=2b=B()print(b.x)# 2delb.x# 删除实例属性(如果有)print(b.x)# 2,类属性
5. 扩展内置类

我们可以继承内置类型,添加自定义行为。

classMyList(list):defsum(self):returnsum(self)ml=MyList([1,2,3])ml.append(4)print(ml.sum())# 10
6. isinstance 与 issubclass

isinstance(obj, Class)检查对象是否是某个类或其子类的实例。

issubclass(Sub, Parent)检查是否是子类关系。

print(isinstance(d,Dog))# Trueprint(isinstance(d,Animal))# Trueprint(issubclass(Dog,Animal))# True
7. 继承的优缺点

优点:

  • 代码复用,减少重复。
  • 建立层次结构,符合现实世界模型。
  • 多态的基础。

缺点:

  • 父类修改可能影响所有子类(脆弱的基类问题)。
  • 继承层次过深会导致理解困难。
  • 不恰当的继承(如“正方形继承矩形”)会违反里氏替换原则。
8. 实战:员工工资系统
classEmployee:def__init__(self,name,hourly_rate,hours_worked):self.name=name self.hourly_rate=hourly_rate self.hours_worked=hours_workeddefcalculate_salary(self):returnself.hourly_rate*self.hours_workedclassManager(Employee):def__init__(self,name,hourly_rate,hours_worked,bonus):super().__init__(name,hourly_rate,hours_worked)self.bonus=bonusdefcalculate_salary(self):base=super().calculate_salary()returnbase+self.bonusclassIntern(Employee):defcalculate_salary(self):returnsuper().calculate_salary()*0.8# 实习生8折

多态的使用:

emps=[Employee("张三",50,160),Manager("李四",80,160,2000),Intern("王五",30,120)]foreinemps:print(f"{e.name}工资:{e.calculate_salary()}")
9. 小结
  • 单继承是Python默认的继承方式,super()确保父类正确初始化。
  • 方法重写让子类定制行为,同时可以调用父类方法进行扩展。
  • 合理使用继承可以提升代码复用性,但应避免过深层次。
思考题

设计一个Vehicle类,然后派生出CarBike,各自实现calculate_fuel_efficiency方法。

http://www.jsqmd.com/news/671918/

相关文章:

  • 开发必看!5款主流Python依赖安全扫描工具深度对比,选型不再难
  • OpCore-Simplify终极指南:三步快速配置黑苹果EFI,零基础也能轻松上手
  • 告别单打独斗:用Nash Q-Learning算法搞定多智能体博弈(附Python代码示例)
  • 手把手教你用STM32F103C8T6和ESP8266搭建智能温室监控(附源码和原子云配置)
  • 3个维度重构数字阅读:从信息消费到知识创造的思维跃迁
  • 如何用浏览器实现专业级音高检测:PitchDetect技术深度解析
  • 保姆级教程:用NovAtel Inertial Explorer 8.7搞定GNSS/INS紧组合后处理(附避坑指南)
  • Word翻译整篇文档的5个高效方法,总有一个适合你
  • 别再只标定外参了!深入理解Kalibr联合标定报告:从IMU噪声参数到时间戳对齐
  • 云原生应用
  • 从入门到精通:AI背景抠除与视频透明化处理完全指南
  • 用cyclictest给你的树莓派实时性“体检”:从安装到结果分析的完整指南
  • 前端构建工具进化史
  • 别再被‘cp: omitting directory’卡住了!Linux新手必知的5个cp命令实用技巧(含-r参数详解)
  • 别只埋头写论文!从审稿人视角看,什么样的博士论文盲审最容易过?
  • OMC - 01 用 19 个 Agent 打造你的 Claude Code“工程团队”:oh-my-claudecode 深度解析与实战指南
  • 2026届必备的六大AI论文工具推荐
  • 避坑指南:在Ubuntu/CentOS上复现《驾驭Makefile》教程,如何解决‘deps’目录导致的无限循环编译?
  • 如何快速微调MedSAM:医疗影像分割模型实战指南
  • 2026 云南房地产沙盘模型定制服务商:云南中安模型军事沙盘模型/工业沙盘模型/展馆设计装修/地形地貌沙盘实力全解析 - 深度智识库
  • 从零开始搭建Linux远程桌面:xrdp开源RDP服务器完整指南
  • 别再让Vue3页面卡死了!用Web Worker处理大数据计算的保姆级避坑指南
  • 做折光仪的公司有哪些 行业知名企业盘点 - 品牌排行榜
  • 网络安全运维分为哪些类别?零基础入门网络安全(非常详细)收藏这一篇就够了!
  • 2025届学术党必备的五大AI写作网站推荐榜单
  • 告别屏幕偏色!手把手教你用高通QDCM 6.0 + CA-410校准手机显示(附完整避坑清单)
  • 手把手教你用Python和Pillow库复现Depix核心思路(附代码)
  • AOT发布失败?Dify API调用崩溃?C# 14原生AOT部署Dify客户端全链路排错手册,含17个IL trimming关键配置项
  • 从SPI到ABZ:实战解析TLE5012B/AS5600磁编码器的5种信号输出模式(附STM32代码片段)
  • WSL 连接宿主机 Chrome DevTools