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学习笔记(十九)面向对象 - 继承相关推荐

  1. python 学习笔记十九 django深入学习四 cookie,session

    缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...

  2. python学习笔记(九)之语句1

    python学习笔记(九)之语句1 print python2中,print是一个语句,python3中它是一个函数. 实例1: >> print "hello,world!&q ...

  3. Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法

    Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法 把开发手册理了一遍,发现还有几个点没有记录下来,其中一个就是使用点对的粗对齐和使用参考目标的精确对齐.为了把这个学习笔记凑够 ...

  4. Python学习笔记(九):类和对象

    Python学习笔记(九):类和对象 关于类和对象 Python学习笔记(九):类和对象 一.类和对象 类的定义 类的实例化 类对象的使用 二.self用法 三.类方法 实例方法 类方法 静态方法 静 ...

  5. Mr.J-- jQuery学习笔记(十九)--自定义动画实现图标特效

    之前有写过自定义动画Mr.J-- jQuery学习笔记(十八)--自定义动画 这次实现一个小demo 图标特效 页面渲染 <!DOCTYPE html> <html lang=&qu ...

  6. Python学习笔记④——类、面向对象的三大特征 [封装+继承+多态]

    ✅ Blogger Learns Python is for learning the "Deep Learning". 文章目录 一.面向对象编程的简介 二.类与对象 -- 基础 ...

  7. python学习笔记六 初识面向对象上(基础篇)

    python面向对象 面向对象编程(Object-Oriented Programming )介绍 对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,虽然大家都知道OOP的三大特性是继承. ...

  8. Python学习笔记:16 面向对象编程入门

    文章目录 类和对象 面向对象的过程 定义类 创建和给对象发消息 打印对象 面向对象编程的支柱 经典案例 例子1:定义一个类描述数字时钟,可以显示时/分/秒,可以运转(走字) 例子2:扑克游戏:四个玩家 ...

  9. Python学习笔记十一:面向对象

    面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类 ...

  10. python学习笔记(九)——文件和异常(重点)

    学文件的目的:数据不能可能一直在内存中存储,持久化存储到磁盘就需要用到文件了! 一.文件和上下文管理器(重点) 1.打开文件-open() 方法 Python open() 方法用于打开一个文件,并返 ...

最新文章

  1. No module named ‘mmcv._ext‘
  2. oracle分页置顶,[置顶]       ibatis查询oracle分页
  3. 2014年Spark亚太峰会参与回忆录
  4. jooq映射原理_JOOQ事实:从JPA批注到JOOQ表映射
  5. java 监控 native 内存_JVM NativeMemoryTracking 分析堆外内存泄露
  6. 您应该知道的ES2020中的10个JavaScript新功能
  7. 2020-09-09
  8. k8s的应用打包工具Helm
  9. 初中计算机考试成绩会纳入吗,【政策】北京海淀将信息技术纳入初中学业水平测试,考试不通过将不予毕业...
  10. 论坛apache伪静态_修正PostViews插件加入CDN静态缓存后计数不正常问题
  11. python接入讯代理_[Python3网络爬虫开发实战] 9.3-付费讯代理、阿布云代理的使用...
  12. STM32MP157移植Qt5.12.10
  13. 长期戴耳机听歌的危害这么大,这些坏习惯你还在做吗
  14. logback日志不打印到文件问题深入剖析
  15. idea如何查看已安装的插件
  16. js重新渲染或重新加载div
  17. telnet登录SMTP发送邮件
  18. 成功的背后(给所有IT人)—从高考落榜到IT奇才
  19. python编写我的世界
  20. RSPapers | 对话推荐系统论文合集

热门文章

  1. 广东理工学院计算机信息管理,广东理工学院信息工程系
  2. 免费的在线客服系统为什么越来越少了
  3. 有关windows黑屏的解决办法
  4. 基于android的五子棋游戏的设计——毕业论文.doc,基于Android的五子棋游戏的设计——毕业论文.doc.doc...
  5. 前端简易服务器之vscode篇(可供项目预览手机访问电脑网页等)
  6. 检查json 或 yaml 文件格式
  7. pandas详解:学习大佬文章后的逐点分析
  8. HTML5的政治斗争
  9. 【ReID】AlignedReID: Surpassing Human-Level Performance in Person Re-Identification
  10. IT七大奇迹评选 摩尔定律Wii苹果iPhone等上榜