继承

  • 继承也是面向对象编程三大特性之一
  • 继承是类与类的一种关系
  • 定义一个新的 class 时,可以从某个现有的 class 继承
  • 新的 class 类就叫子类(Subclass)
  • 被继承的类一般称为父类、基类、超类
  • 通俗理解:子类与父类的关系,即爸爸与儿子,爸爸有了个儿子,儿子继承爸爸的属性和方法,爸爸的爸爸就是爷爷...以此类推

继承的实际栗子

  • 猫、狗都是动物,所以动物是父类,猫、狗是动物的子类
  • 小菠萝、大菠萝都是人类,所以人类是父类,小菠萝、大菠萝是人类的子类
  • 动物、人类都是生物,所以生物是父类,动物、人类是生物的子类
  • 那么一般称生物类是猫、狗、小菠萝、大菠萝的超类、祖父类

继承的好处

  • 实现代码的重用,相同的代码不需要重复编写
  • 子类拥有父类的所有属性、方法,提高了代码的可扩展性和重用性
  • 在子类继承父类的同时,也可以重新定义某些属性,并重写某些方法,即覆盖父类的属性、方法,变成子类独有的属性、方法
  • 子类也可以添加新的属性、方法

继承的使用场景

  • 假如我需要定义几个类,而类与类之间有一些公共的属性和方法
  • 可以把公共的属性和方法提取作为父类(基类)的属性、方法,而特殊的属性、方法则在本类中定义
  • 比如猫、狗都有吃喝拉撒四种行为,这些就是公共方法;但只有猫会喵喵叫,只有狗会汪汪叫,这些就是特殊方法

具体可以看下面的【不使用继承、使用继承的区别】

继承有几种?

  1. 单继承
  2. 多继承

Python 中继承的简单语法

class Parent:passclass Child(Parent):pass

有个重点

所有类的都有一个共同父类,就是 object,默认会继承它,写或不写都一样

class Parent:passclass Parent(object):pass

不使用继承、使用继承的区别

需求背景

有一个动物类、狗类、猫类

  • 动物类有吃、喝、跑方法
  • 狗类有吃、喝、跑、汪汪叫方法
  • 猫类有吃、喝、跑、喵喵叫方法

不使用继承

类图

需求分析

  • 每个类都拥有自己的方法
  • 他们都拥有吃、喝、拉方法,且功能一样

实际代码

# 不使用继承
class Animal:def eat(self):print("吃东西...")def drink(self):print("喝水...")def run(self):print("跑步...")class Cat:def eat(self):print("吃东西...")def drink(self):print("喝水...")def run(self):print("跑步...")def miao(self):print("喵喵叫...")class Dog:def eat(self):print("吃东西...")def drink(self):print("喝水...")def run(self):print("跑步...")def wang(self):print("汪汪叫...")

这样写有什么问题?

  • 三个类,需要重复写三次吃、喝、跑的方法
  • 假设此时需要修改 吃 方法的代码,那么还得同步修改三个类的 吃 方法,属于不必要的重复性工作
  • 使用继承可以大大减少开发工作量

使用继承

类图

从类图就能看到,使用继承就变得简单多了

需求分析

  • 提取三个类的公共方法,吃、喝、跑,然后抽象成动物类
  • 所以动物类是一个父类,狗类、猫类继承它

实际代码

# 使用继承
class Animal:def eat(self):print("吃东西...")def drink(self):print("喝水...")def run(self):print("跑步...")class Cat(Animal):def miao(self):print("喵喵叫...")class Dog(Animal):def wang(self):print("汪汪叫...")

优势

  • 子类继承父类,可以直接享受父类已经封装好的方法,不再需要自己开发一次
  • 子类可以根据自身的需要,封装子类独有的属性、方法,比如猫类的喵喵叫,狗类的汪汪叫

专业术语总结

  • Dog 类是 Animale 类的子类,Animal 类是 Dog 类的父类,Dog 类从 Animal 类继承
  • Dog 类是 Animale 类的派生类,Animal 类是 Dog 类的基类,Dog 类从 Animal 类派生

继承的传递性

什么是传递性

通俗来讲

  • C 类从 B 类继承,B 类又从 A 类继承
  • 那么 C 类会拥有 A、B 类的所有属性和方法

官方来讲

子类拥有父类以及父类的父类,以及所有父类的父类的父类...中封装的所有属性、方法

实际栗子

  • 还是拿上面的动物类、狗类、猫类继续展开讲
  • 假设此时有一个新的类叫柴犬类,继承于狗类,有独有的方法摇尾巴

类图

实际代码

class Animal:def eat(self):print("吃东西...")def drink(self):print("喝水...")def run(self):print("跑步...")class Cat(Animal):def miao(self):print("喵喵叫...")class Dog(Animal):def wang(self):print("汪汪叫...")class Chai(Dog):def shake(self):print("小柴柴摇尾巴...")chai = Chai()
# 调用 父类的父类 的方法
chai.eat()
# 调用 父类 的方法
chai.wang()
# 调用 自己独有 的方法
chai.shake()# 输出结果
吃东西...
汪汪叫...
小柴柴摇尾巴...

  • Chai 类拥有 Dog 类、Animal 类所有属性、方法
  • 但它不会拥有 Cat 类的属性、方法,因为他们没有继承关系

继承和抽象

抽象即抽取类似或者说比较像的部分

小栗子

  • 从小菠萝、小韵韵两个对象中,抽取公共部分抽象成父类
  • 再从人,猪,狗这三个类,抽取公共部分抽象成父类

继承的重点

  • 是基于抽象的结果,通过编程语言去实现它
  • 先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构
  • 抽象只是分析和设计的过程中,一个动作或者说一个技巧,通过抽象得到一个类

代码栗子

class Animal:def __init__(self, name, age, sex):self.__name = nameself.__age = ageself.__sex = sex# 提取的公共方法def eat(self):print(f"{self.__name} 正在吃饭....")@propertydef name(self):return self.__nameclass Person(Animal):def walk(self):print(f"{self.name} 两条腿正在走路")class Pig(Animal):def kill(self):print(f"{self.name} 猪正在去屠宰场ing...")class Dog(Animal):def wang(self):print(f"{self.name} 汪汪叫ing...")person = Person("小菠萝", 25, "Male")
pig = Pig("麦兜", 4, "公")
dog = Dog("柴犬", 3, "母")# 调用父类的公共方法
person.eat()
pig.eat()
dog.eat()# 调用子类独有的方法
person.walk()
pig.kill()
dog.wang()# 输出结果
小菠萝 正在吃饭....
麦兜 正在吃饭....
柴犬 正在吃饭....小菠萝 两条腿正在走路
麦兜 猪正在去屠宰场ing...
柴犬 汪汪叫ing...

Python - 面向对象编程 - 三大特性之继承相关推荐

  1. Python面向对象编程三大特性之继承

    继承 继承 继承的语法 重写 扩展 引用 super().父类方法名 参数传递 code:_6Inheritance.py # ************************************ ...

  2. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

  3. Python面向对象编程三大特性之多态

    多态 code:_9polymorphism.py # ***************************************** """ 多态:对于同一个方法, ...

  4. Python面向对象编程三大特性之封装

    封装 封装 封装的级别 获取对象的所有成员 code:_5packaging.py # ******************************************************** ...

  5. 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态

    介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...

  6. 面向对象的三大特性之继承

    # 面向对象的三大特性之继承# 当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好 (如机器人) # 当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好 (动物-- ...

  7. java面向对象特性_java面向对象编程三大特性

    一说到java面向对象编程就想到面向对象的三大特性,封装,继承和多态,下面我们来具体分析以下这三大特性在编程中是如何具体体现的. 封装 将类的属性和具体实现细节隐藏,只提供相关的接口和方法来对隐藏信息 ...

  8. C++ 面向对象程序三大特性之 继承

    目录 继承的概念 继承的定义及使用 继承方式和访问权限 基类和派生类对象的赋值转换 继承中的各成员的作用域 派生类的默认成员函数 构造函数 拷贝构造 赋值运算符重载函数 析构函数 继承与友元 继承与静 ...

  9. Python面向对象的三大特性

    三大特性 特性 内容 封装 确保对象中数据的安全 继承 保证了对象的可扩展性 多态 增加了对象的灵活性 1.封装 隐藏对象中不希望被外部访问到的属性.方法. 封装虽然增加了类定义的复杂度,但确保了类的 ...

最新文章

  1. 【图】2015年Google搜索引擎排名算法(完整版)
  2. fastclick:处理移动端click事件300毫秒延迟
  3. MAC版Eclipse的常用快捷键
  4. input上传图片;input上传file;vue上传图片。
  5. 安装ipython失败 in error catcher_疯狂的Python:零基础小白入门帖子详情 - 网易云课堂...
  6. STM32-Systick滴答定时器-延时函数
  7. SSH框架中怎么使用Hibernate查询一个对象
  8. c++ primer 5th(中文版)勘误
  9. “PE文件格式”1.9版 完整译文
  10. Data Minig --- Decision Tree ID3 C4.5 Gini Index
  11. matlab netcdf,Matlab读取Netcdf文件
  12. JDK 9 发布仅数月,为何在生产环境中却频遭嫌弃?
  13. connect by prior id= pid start with id='1' 树结构查询
  14. PTA 程序设计天梯赛(141~160题)
  15. 基于fpga的dds函数信号发生器的设计_低频信号发生器
  16. ROS学习笔记(2)——ROS通信机制
  17. 微信怎么录屏聊天记录?这两个方法值得收藏!
  18. 三分钟学会数据库, INSERT INTO 插入
  19. 程序员与颈椎病(三):颈椎病终极解决办法
  20. 中央民族大学计算机考研2020,2020年中央民族大学856计算机学科专业综合考研复习资料...

热门文章

  1. 如何分割cue+ape、cue+flac、cue+wav、cue+dts整轨音乐文件
  2. 异常信息:test02FlexController”不存在,wufa
  3. php或js获取word内容,js能读取word js读取word文档
  4. 计蒜客 - 蒜头君的任务
  5. python爬虫数据分析项目 双十一_Python爬取淘宝商品数据,价值千元的爬虫外包项目!...
  6. 记vue+drf前后端分离学习过程(2)
  7. 信息学奥赛辅导经验谈 问题教学法中的学生思维能力培养
  8. 【高中数学教资】教案设计通用模板
  9. sendgrid java_store-sendgrid-java-how-to-send-email-example | Microsoft Docs
  10. UVa Problem 10041 Vito’s Family (Vito 家族)