继承

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

继承的实际栗子

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

继承的好处

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

继承的使用场景

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

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

继承有几种?

  1. 单继承
  2. 多继承

Python 中继承的简单语法

class Parent:
pass class Child(Parent):
pass

有个重点

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

class Parent:
pass class 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 = name
self.__age = age
self.__sex = sex # 提取的公共方法
def eat(self):
print(f"{self.__name} 正在吃饭....") @property
def name(self):
return self.__name class 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 - 面向对象编程 - 三大特性之封装

    简单介绍封装 封装是面向对象编程的一大特点 封装可以被认为是一个保护屏障,防止该类的属性.方法和数据结构被外部随意访问 要访问该类的属性.私有方法.数据结构,必须由指定的方法控制访问 深入理解封装 在 ...

  2. 2.Java面向对象编程三大特性之继承

    在<Think in Java>中有这样一句话:复用代码是java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复用代码并对其加以改变是不够的,他还必须能够做更多的事情.复用 ...

  3. Python面向对象的三大特性之继承和组合

    继承和组合 一.组合 组合:组合指的是,在一个类中以另外一个类的对象(也就是实例)作为数据属性,称为类的组合 也就是说:一个类的属性是另一个类的对象,就是组合 例子: 圆环是由两个圆组成的,圆环的面积 ...

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

    前置知识 封装 详解文章:https://www.cnblogs.com/poloyy/p/15203989.html 封装根据职责将属性.方法封装到一个抽象的类中 定义类的准则-封装 继承 详解文章 ...

  5. python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试

    一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...

  6. Java学习笔记二十一:Java面向对象的三大特性之继承

    Java面向对象的三大特性之继承 一:继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方 ...

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

    面向对象的三大特性:继承,封装,多态 什么时候用封装: 同一种功能的时候, 譬如:把一部分数据或方法,封装到同一个类的中 PS:在构造方法中,原始数据中....

  8. Python 面向对象的三大特性:封装,继承,多态

    # 面向对象的三大特性:封装,继承,多态 # 继承的影响:资源的继承,资源的使用,资源的覆盖,资源的累加 # 资源的继承,在Python中的继承是指能使用父类的资源,而不是说在子类也复制一份父类代码到 ...

  9. Python面向对象初始(三大特征,多态,继承,封装)

    Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...

随机推荐

  1. K8S系列第四篇(Dockerfile)

    DokcerFile 镜像定制 更多精彩内容请关注微信公众号:新猿技术生态圈 定制docker镜像的方式有两种: 手动修改容器内容,导出新的镜像. 基于dockerfile自行编写指令,基于指令流程创 ...

  2. 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【三】

    软件定时器:是基于系统Tick时钟中断且由软件来模拟的定时器,当经过设定的Tick时钟计数值后会触发用户定义的回调函数.定时精度与系统Tick时钟的周期有关. 定时器运行机制: cmsis_os2的A ...

  3. Spring-初见

    目录 组成 Spring Boot与Spring Cloud IOC DI 1.常量注入 2.Bean注入 3.Properties注入 p命名和c命名注入 Bean Singleton Protot ...

  4. 从零开始学习JAVA(入门基础)

    目录 博主从零开始学习JAVA(入门基础) 1.搭建JAVA开发环境 卸载JDK(未安装的请忽略) 安装JDK 2.编程语言中,何为编译型与解释型 编译型 解释型 3.第一个JAVA应用程序 4.JA ...

  5. 记录21.07.24 —— Vue的组件与路由

    VUE组件 作用:复用性 创建组件的三种方式 第一种:使用extends搭配component方法 第二种:直接使用component方法 只有用vue声明且命名的才称之为创建组件 注意:templa ...

  6. 自学linux——16.LAMP项目上线流程

    LAMP项目上线流程 一.编译安装与卸载Nginx(web服务器软件,类似于Apache) 1.安装nginx ①    下载nginx 网页下载https://nginx.org/en/downlo ...

  7. 来看看是什么原因导致生产服上的系统CPU高的?

    我们可能会遇到生产服务器CPU很高的问题,有时候能确定是哪个进程,但是不知道这个进程都在干什么,所以也无从下手,无法解决问题.只能不断的重启,重启等. 最近也看了[一线码农]的一些教程,觉得都很不错, ...

  8. Java面向对象01——什么是面向对象

    面向过程&面向对象 面向过程思想(微观): 步骤清晰简单,第一步做什么,第二部做什么....... 面向过程适合处理一些较为简单的问题 面向对象思想(宏观): 物以类聚,分类的思维模式,思考问 ...

  9. 算法竞赛中的常用JAVA API :HashSet 和 TreeSet(转载)

    算法竞赛中的常用JAVA API :HashSet 和 TreeSet set set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E ...

  10. 管理员权限的窗口,收不到WM_COPYDATA

    windows用户界面特权隔离 一个运行在较低特权等级的应用程序的行为就受到了诸多限制,它不可以: 验证由较高特权等级进程创建的窗口句柄 通过调用SendMessage和PostMessage向由较高 ...