Python学习笔记(十九)面向对象 - 继承
Python学习笔记(十九)面向对象 - 继承
一、继承的概念
# 继承:子类继承父类的所有方法和属性# 1. 子类
class A(object):def __init__(self):self.num = 2def info_print(self):print(self.num)# 2. 父类
class B(A):passresult = B()
result.info_print() # 2
二、单继承
# 1. 师傅类:属性和方法
class Master(object):def __init__(self):self.kongfu ='[古法煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')# 2. 徒弟类:继承师傅类
class Prentice(Master):pass# 3. 用徒弟类创建对象,调用实例属性和方法
daiqu = Prentice()print(daiqu.kongfu) # [古法煎饼果子配方]daiqu.make_cake() # 运用[古法煎饼果子配方]制作煎饼果子
三、多继承
所谓多继承就是一个类同时继承多个父类。
class Master(object):def __init__(self):self.kongfu ='[古法煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')class School(object):def __init__(self):self.kongfu = '[黑马煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')class Prentice(School,Master):passdaqiu = Prentice()print(daqiu.kongfu) # [黑马煎饼果子配方]daqiu.make_cake() # 运用[黑马煎饼果子配方]制作煎饼果子
注意:当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法。
四、子类重写父类同名属性和方法
class Master(object):def __init__(self):self.kongfu ='[古法煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')class School(object):def __init__(self):self.kongfu = '[黑马煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')# 独创配方
class Prentice(School,Master):def __init__(self):self.kongfu = '[独创煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')daqiu = Prentice()print(daqiu.kongfu) # [独创煎饼果子配方]daqiu.make_cake() # 运用[独创煎饼果子配方]制作煎饼果子
结论:如果子类和父类拥有同名属性和方法,那么子类创建对象调用属性和方法的时候,调用的是子类里面的同名属性和方法。
查找某个类的继承关系:
print(Prentice.__mro__) # 得到类的继承层级关系
# (<class '__main__.Prentice'>, <class '__main__.School'>, <class '__main__.Master'>, <class 'object'>)
五、子类调用父类同名属性和方法
class Master(object):def __init__(self):self.kongfu ='[古法煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')class School(object):def __init__(self):self.kongfu = '[黑马煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')# 独创配方
class Prentice(School,Master):def __init__(self):self.kongfu = '[独创煎饼果子配方]'def make_cake(self):# 如果是先调用了父类的属性和方法,父类属性会覆盖子类属性,故在调用属性前,先调用自己子类的初始化self.__init__()print(f'运用{self.kongfu}制作煎饼果子')# 调用父类方法,但是为保证调用到的也是父类的属性,必须在调用方法前调用父类的初始化def make_master_cake(self):Master.__init__(self)Master.make_cake(self)def make_school_cake(self):School.__init__(self)School.make_cake(self)daqiu = Prentice()print(daqiu.kongfu) # [独创煎饼果子配方]daqiu.make_cake() # 运用[独创煎饼果子配方]制作煎饼果子
daqiu.make_master_cake() # 运用[古法煎饼果子配方]制作煎饼果子
daqiu.make_school_cake() # 运用[黑马煎饼果子配方]制作煎饼果子
六、多层继承
class Master(object):def __init__(self):self.kongfu ='[古法煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')
class School(object):def __init__(self):self.kongfu = '[黑马煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')# 独创配方
class Prentice(School,Master):def __init__(self):self.kongfu = '[独创煎饼果子配方]'def make_cake(self):# 如果是先调用了父类的属性和方法,父类属性会覆盖子类属性,故在调用属性前,先调用自己子类的初始化self.__init__()print(f'运用{self.kongfu}制作煎饼果子')# 调用父类方法,但是为保证调用到的也是父类的属性,必须在调用方法前调用父类的初始化def make_master_cake(self):Master.__init__(self)Master.make_cake(self)def make_school_cake(self):School.__init__(self)School.make_cake(self)# 徒孙类
class Tusun(Prentice):passxiaoqiu = Tusun()print(xiaoqiu.kongfu) # [独创煎饼果子配方]xiaoqiu.make_cake() # 运用[独创煎饼果子配方]制作煎饼果子
xiaoqiu.make_master_cake() # 运用[古法煎饼果子配方]制作煎饼果子
xiaoqiu.make_school_cake() # 运用[黑马煎饼果子配方]制作煎饼果子
print(Tusun.__mro__) # (<class '__main__.Tusun'>, <class '__main__.Prentice'>, <class '__main__.School'>, <class '__main__.Master'>, <class 'object'>)
七、super()调用父类方法
之前的函数类名.父类方法也可以调用父类方法,代码如下:
class Master(object):def __init__(self):self.kongfu ='[古法煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')class School(object):def __init__(self):self.kongfu = '[黑马煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')# 独创配方
class Prentice(School,Master):def __init__(self):self.kongfu = '[独创煎饼果子配方]'def make_cake(self):# 如果是先调用了父类的属性和方法,父类属性会覆盖子类属性,故在调用属性前,先调用自己子类的初始化self.__init__()print(f'运用{self.kongfu}制作煎饼果子')# 需求:一次性调用父类Master School 的方法def make_old_cake(self):# 方法一: 如果定义的类名修改,这里的类名也要修改,麻烦:代码量太庞大,冗余School.__init__(self)School.make_cake(self)Master.__init__(self)Master.make_cake(self)daqiu = Prentice()daqiu.make_old_cake()
用super()调用父类方法:
class Master(object):def __init__(self):self.kongfu ='[古法煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')class School(Master):def __init__(self):self.kongfu = '[黑马煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')super(School, self).__init__()super(School, self).make_cake()# 独创配方
class Prentice(School):def __init__(self):self.kongfu = '[独创煎饼果子配方]'def make_cake(self):# 如果是先调用了父类的属性和方法,父类属性会覆盖子类属性,故在调用属性前,先调用自己子类的初始化self.__init__()print(f'运用{self.kongfu}制作煎饼果子')# 需求:一次性调用父类Master School 的方法def make_old_cake(self):# 方法二:super()# 方法2.1 super(当前类名,self).函数()super(Prentice,self).__init__()super(Prentice,self).make_cake()daqiu = Prentice()daqiu.make_old_cake()
class Master(object):def __init__(self):self.kongfu ='[古法煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')class School(Master):def __init__(self):self.kongfu = '[黑马煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')# super(School, self).__init__()# super(School, self).make_cake()super().__init__()super().make_cake()# 独创配方
class Prentice(School):def __init__(self):self.kongfu = '[独创煎饼果子配方]'def make_cake(self):# 如果是先调用了父类的属性和方法,父类属性会覆盖子类属性,故在调用属性前,先调用自己子类的初始化self.__init__()print(f'运用{self.kongfu}制作煎饼果子')# 需求:一次性调用父类Master School 的方法def make_old_cake(self):# # 方法一: 如果定义的类名修改,这里的类名也要修改,麻烦:代码量太庞大,冗余# School.__init__(self)# School.make_cake(self)# Master.__init__(self)# Master.make_cake(self)# 方法二:super()# # 方法2.1 super(当前类名,self).函数()# super(Prentice,self).__init__()# super(Prentice,self).make_cake()# 方法2.2 无参数super().函数()super().__init__()super().make_cake()daqiu = Prentice()daqiu.make_old_cake()
八、私有属性和私有方法
8.1 定义私有属性和方法
在Python中,可以为实例属性和方法设置私有权限,即设置某个实例属性或者实例方法不继承给子类。
设置私有权限的方法:在属性名 或 方法名 前加两个下划线__
class Master(object):def __init__(self):self.kongfu ='[古法煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')class School(object):def __init__(self):self.kongfu = '[黑马煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')# 独创配方
class Prentice(School,Master):def __init__(self):self.kongfu = '[独创煎饼果子配方]'# 私有属性: 不能继承给子类self.__money = 2000000def make_cake(self):# 如果是先调用了父类的属性和方法,父类属性会覆盖子类属性,故在调用属性前,先调用自己子类的初始化self.__init__()print(f'运用{self.kongfu}制作煎饼果子')# 定义私有方法:不能继承给子类def __info_print(self):print('这是私有方法')def make_master_cake(self):Master.__init__(self)Master.make_cake(self)def make_school_cake(self):School.__init__(self)School.make_cake(self)class Tusun(Prentice):passxiaoqiu = Tusun()
print(xiaoqiu.money) # money 是 Prentice的私有属性,故子类没有这个属性
print(xiaoqiu.info_print) # info_print() 是Prentice的私有方法,故子类没有这个方法
8.2 获取和修改私有属性
在Python中,一般定义函数get__xx用来获取私有属性,定义set__xx用来修改私有属性值。
class Master(object):def __init__(self):self.kongfu ='[古法煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')class School(object):def __init__(self):self.kongfu = '[黑马煎饼果子配方]'def make_cake(self):print(f'运用{self.kongfu}制作煎饼果子')# 独创配方
class Prentice(School,Master):def __init__(self):self.kongfu = '[独创煎饼果子配方]'# 私有属性: 不能继承给子类self.__money = 2000000# 获取私有属性的值 get__xx()def get_money(self):return self.__money# 修改私有属性的值 set__xx()def set_money(self):self.__money = 50000def make_cake(self):# 如果是先调用了父类的属性和方法,父类属性会覆盖子类属性,故在调用属性前,先调用自己子类的初始化self.__init__()print(f'运用{self.kongfu}制作煎饼果子')# 定义私有方法:不能继承给子类def __info_print(self):print('这是私有方法')def make_master_cake(self):Master.__init__(self)Master.make_cake(self)def make_school_cake(self):School.__init__(self)School.make_cake(self)class Tusun(Prentice):passxiaoqiu = Tusun()
print(xiaoqiu.get_money()) # 2000000
xiaoqiu.set_money() # 修改
print(xiaoqiu.get_money()) # 50000
九、总结
Python学习笔记(十九)面向对象 - 继承相关推荐
- python 学习笔记十九 django深入学习四 cookie,session
缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...
- python学习笔记(九)之语句1
python学习笔记(九)之语句1 print python2中,print是一个语句,python3中它是一个函数. 实例1: >> print "hello,world!&q ...
- Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法
Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法 把开发手册理了一遍,发现还有几个点没有记录下来,其中一个就是使用点对的粗对齐和使用参考目标的精确对齐.为了把这个学习笔记凑够 ...
- Python学习笔记(九):类和对象
Python学习笔记(九):类和对象 关于类和对象 Python学习笔记(九):类和对象 一.类和对象 类的定义 类的实例化 类对象的使用 二.self用法 三.类方法 实例方法 类方法 静态方法 静 ...
- Mr.J-- jQuery学习笔记(十九)--自定义动画实现图标特效
之前有写过自定义动画Mr.J-- jQuery学习笔记(十八)--自定义动画 这次实现一个小demo 图标特效 页面渲染 <!DOCTYPE html> <html lang=&qu ...
- Python学习笔记④——类、面向对象的三大特征 [封装+继承+多态]
✅ Blogger Learns Python is for learning the "Deep Learning". 文章目录 一.面向对象编程的简介 二.类与对象 -- 基础 ...
- python学习笔记六 初识面向对象上(基础篇)
python面向对象 面向对象编程(Object-Oriented Programming )介绍 对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,虽然大家都知道OOP的三大特性是继承. ...
- Python学习笔记:16 面向对象编程入门
文章目录 类和对象 面向对象的过程 定义类 创建和给对象发消息 打印对象 面向对象编程的支柱 经典案例 例子1:定义一个类描述数字时钟,可以显示时/分/秒,可以运转(走字) 例子2:扑克游戏:四个玩家 ...
- Python学习笔记十一:面向对象
面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类 ...
- python学习笔记(九)——文件和异常(重点)
学文件的目的:数据不能可能一直在内存中存储,持久化存储到磁盘就需要用到文件了! 一.文件和上下文管理器(重点) 1.打开文件-open() 方法 Python open() 方法用于打开一个文件,并返 ...
最新文章
- No module named ‘mmcv._ext‘
- oracle分页置顶,[置顶] ibatis查询oracle分页
- 2014年Spark亚太峰会参与回忆录
- jooq映射原理_JOOQ事实:从JPA批注到JOOQ表映射
- java 监控 native 内存_JVM NativeMemoryTracking 分析堆外内存泄露
- 您应该知道的ES2020中的10个JavaScript新功能
- 2020-09-09
- k8s的应用打包工具Helm
- 初中计算机考试成绩会纳入吗,【政策】北京海淀将信息技术纳入初中学业水平测试,考试不通过将不予毕业...
- 论坛apache伪静态_修正PostViews插件加入CDN静态缓存后计数不正常问题
- python接入讯代理_[Python3网络爬虫开发实战] 9.3-付费讯代理、阿布云代理的使用...
- STM32MP157移植Qt5.12.10
- 长期戴耳机听歌的危害这么大,这些坏习惯你还在做吗
- logback日志不打印到文件问题深入剖析
- idea如何查看已安装的插件
- js重新渲染或重新加载div
- telnet登录SMTP发送邮件
- 成功的背后(给所有IT人)—从高考落榜到IT奇才
- python编写我的世界
- RSPapers | 对话推荐系统论文合集
热门文章
- 广东理工学院计算机信息管理,广东理工学院信息工程系
- 免费的在线客服系统为什么越来越少了
- 有关windows黑屏的解决办法
- 基于android的五子棋游戏的设计——毕业论文.doc,基于Android的五子棋游戏的设计——毕业论文.doc.doc...
- 前端简易服务器之vscode篇(可供项目预览手机访问电脑网页等)
- 检查json 或 yaml 文件格式
- pandas详解:学习大佬文章后的逐点分析
- HTML5的政治斗争
- 【ReID】AlignedReID: Surpassing Human-Level Performance in Person Re-Identification
- IT七大奇迹评选 摩尔定律Wii苹果iPhone等上榜