子类重写父类方法|学习笔记

简介: 快速学习子类重写父类方法,先来介绍子类重写父类方法。多态其实就是一种子类重写父类的方法。

开发者学堂课程【Python 入门 2020年版子类重写父类方法】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/639/detail/10392


子类重写父类方法

 

内容简介

一、继承特点

二、调用父类的两种方式

 

一、继承特点

如果一个类 A继承自类 B,由类 A创建出来的实例对象都能直接使用类 B里的定义方法

输入代码:

class Person(object):

def__init__(self,name,age):

self.name=name

self.age=age

def sleep(self):

print(self.name+'正在睡觉')

class Student(Person):

pass

s =Student(‘jerry’,20)    

//创建一个实例对象,此处必须有参数,因为在调时会先调用 Student的 init方法,如果没有就会调用父类 Person的 init方法,Person的 init方法这里需要两个参数

s.sleep()

运行一下,结果显示

jerry正在睡觉

注意 s =Student(‘jerry’,20)调用了父类的_init_方法

s.sleep()调用了父类的 sleep方法

但是也可以定义自己的方法,修改代码 pass为

def study(self):

print(self.name + ‘正在学习’)

现在我们注意到父类的 sleep方法和子类的 sleep方法实现一样,那有没有可能不一样的?不一样该如何操作呢?

比如现在要实现如果是学生,打印出的结果为学生正在课间睡觉

只需要重写,在正在学习的代码上方插入代码:

def sleep(self):

print(self.name+’正在课间休息时睡觉’)  //与父类的 sleep方法名一致,是将父类的 sleep进行重写

思考重写完之后再调 sleep是调用父类的还是子类的?调用自己的,之前讲解过 Student._mro_,mro属性就规定了调用哪个

运行一下,结果显示

jerry正在课间休息时睡觉

(,,)

可以看到 mro属性先调用自己的再调用父类的再调用 object

mro就是 method resolution order方法解决顺序

在写的时候其实存在两种情况:

1)子类的实现和父类的实现完全不一样,子类可以选择重写父类的方法。

但是不能直接删除掉父类的代码 def sleep(self):

print(self.name + ‘正在睡觉’)

例如当下方还存在 p想睡觉,就会被影响

p=Person(‘jack’,21)

p.sleep()

/子类的实现和父类的实现完全不一样,在子类定义一个同类的方法,把父类的方法覆盖掉,是在父类已经有的基础上加了一个新的属性

2)子类在父类的基础上又有更多的实现。/可以在子类的功能的基础上调一下父类的方法/

代码中其实调用了两个方法,init方法和 sleep方法

比如现在想要学生在创建时除了拥有名字年龄,再来添加上学校

在正在课间休息时睡觉的代码上方添加代码:

def__init__(self,name,age,school):

self.name=name

self.age=age

self.school = school

再在 s=Student中添加’春天花花幼稚园’的学校属性,jerry就会有学校的属性

之后我们观察到代码

self.name=name

self.age=age

与父类一致,还可以使用别的方法简单写,先注释掉,其实这就是子类在父类实现的基础上,又添加了自己新的功能

 

二、调用父类方法的两种方式

之后调用父类方法,调用父类方法有两种方式:

第一种:init方法中第一个参数 self是一个普通的对象方法,那么对象方法就可以通过 Person类名._init_()

Person.__init__方法与之前调用的方法类似相当于有代码:

p =Person(‘jack’,12)

Person.sleep(p)   //想要调 person的 sleep方法,可以写 person.sleep,然后将 p传进去

而 init方法写为:

p=object.__new__(Person)

p.__init__('zhangsan',18)

但其实该方法可以使用实例方法来调,也可以使用类方法来调:

Person.__init__(p,'zhangsan',18)

init方法其实也是一个对象方法,跟 p.sleep()调用类似

调用 p.sleep()方法也可以写为 Person.sleep(p)

如果现在就是要在 Student的 init中调用一下 Person的 init方法,就可以直接写 Person._init_()

如果调用实例方法,需要手动给 self传参,self必须要写,self就相当于代码 Person._init_(p,’zhangsan’,18)传的是 p

综上,即父类名.方法名(self,参数列表)

Person.__init__(self,name,age)  

第二种:

使用 super直接调用父类方法。推荐使用第二种方式。

super(Student,self).__init__(name,age)

 

相关文章
|
XML Java 数据格式
Spring系列(三)之Bean的生命周期以及Bean的单例与多例模式
Spring系列(三)之Bean的生命周期以及Bean的单例与多例模式
|
消息中间件 存储 缓存
十万订单每秒热点数据架构优化实践深度解析
【11月更文挑战第20天】随着互联网技术的飞速发展,电子商务平台在高峰时段需要处理海量订单,这对系统的性能、稳定性和扩展性提出了极高的要求。尤其是在“双十一”、“618”等大型促销活动中,每秒需要处理数万甚至数十万笔订单,这对系统的热点数据处理能力构成了严峻挑战。本文将深入探讨如何优化架构以应对每秒十万订单级别的热点数据处理,从历史背景、功能点、业务场景、底层原理以及使用Java模拟示例等多个维度进行剖析。
382 8
|
XML Android开发 数据格式
37. 【Android教程】基于监听的事件处理机制
37. 【Android教程】基于监听的事件处理机制
275 2
|
前端开发 Java
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
文章介绍了如何使用SpringBoot创建简单的后端服务器来处理HTTP请求,包括建立连接、编写Controller处理请求,并返回响应给前端或网址。
368 0
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
|
网络协议 Ubuntu Linux
在IPad Pro上怎么实现代码自由,如何让IPad Pro变成你的生产力工具?
如何让IPad Pro变成你的生产力工具?在IPad上用Vscode写代码搞开发
665 1
在IPad Pro上怎么实现代码自由,如何让IPad Pro变成你的生产力工具?
|
测试技术 数据安全/隐私保护 网络虚拟化
干货 | 如何用python实现每天定时备份交换机配置文件? 真香~
干货 | 如何用python实现每天定时备份交换机配置文件? 真香~
244 0
|
前端开发 JavaScript 中间件
React中使用​​useReducer​​​高阶钩子来管理状态
通过本文的介绍,您可以在React中使用 `useReducer`高阶钩子来管理复杂的状态逻辑。`useReducer`不仅提供了清晰的状态管理方式,还可以通过与 `useContext`结合,实现全局状态管理。此外,通过自定义中间件,可以进一步扩展其功能。希望本文对您理解和应用 `useReducer`有所帮助。
240 0
|
监控 JavaScript 前端开发
Web Vitals:提升网页用户体验的关键技术
【7月更文挑战第18天】Web Vitals 为开发者提供了一套全面而具体的性能优化指南,帮助开发者从多个维度提升网页的用户体验。通过关注 LCP、FID 和 CLS 等核心指标,并采取有效的优化策略,我们可以让网页加载更快、交互更流畅、视觉更稳定,从而赢得用户的青睐和信任。在未来的发展中,持续关注并优化 Web Vitals 指标将是提升网页用户体验的重要方向。
|
程序员 开发者
IDEA插件-Rainbow Brackets彩虹括号
DEA插件-Rainbow Brackets是一款用于增强IDEA开发环境的工具,它可以帮助开发者更好地管理和展示代码中的括号。
4053 0
IDEA插件-Rainbow Brackets彩虹括号
|
JavaScript
VUE element-ui之table表格内容样式(颜色)修改
VUE element-ui之table表格内容样式(颜色)修改
1188 0
VUE element-ui之table表格内容样式(颜色)修改