Python - 面向对象编程 - 三大特性之继承
继承
- 继承也是面向对象编程三大特性之一
- 继承是类与类的一种关系
- 定义一个新的 class 时,可以从某个现有的 class 继承
- 新的 class 类就叫子类(Subclass)
- 被继承的类一般称为父类、基类、超类
- 通俗理解:子类与父类的关系,即爸爸与儿子,爸爸有了个儿子,儿子继承爸爸的属性和方法,爸爸的爸爸就是爷爷...以此类推
继承的实际栗子
- 猫、狗都是动物,所以动物是父类,猫、狗是动物的子类
- 小菠萝、大菠萝都是人类,所以人类是父类,小菠萝、大菠萝是人类的子类
- 动物、人类都是生物,所以生物是父类,动物、人类是生物的子类
- 那么一般称生物类是猫、狗、小菠萝、大菠萝的超类、祖父类
继承的好处
- 实现代码的重用,相同的代码不需要重复编写
- 子类拥有父类的所有属性、方法,提高了代码的可扩展性和重用性
- 在子类继承父类的同时,也可以重新定义某些属性,并重写某些方法,即覆盖父类的属性、方法,变成子类独有的属性、方法
- 子类也可以添加新的属性、方法
继承的使用场景
- 假如我需要定义几个类,而类与类之间有一些公共的属性和方法
- 可以把公共的属性和方法提取作为父类(基类)的属性、方法,而特殊的属性、方法则在本类中定义
- 比如猫、狗都有吃喝拉撒四种行为,这些就是公共方法;但只有猫会喵喵叫,只有狗会汪汪叫,这些就是特殊方法
具体可以看下面的【不使用继承、使用继承的区别】
继承有几种?
- 单继承
- 多继承
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 - 面向对象编程 - 三大特性之继承的更多相关文章
- Python - 面向对象编程 - 三大特性之封装
简单介绍封装 封装是面向对象编程的一大特点 封装可以被认为是一个保护屏障,防止该类的属性.方法和数据结构被外部随意访问 要访问该类的属性.私有方法.数据结构,必须由指定的方法控制访问 深入理解封装 在 ...
- 2.Java面向对象编程三大特性之继承
在<Think in Java>中有这样一句话:复用代码是java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复用代码并对其加以改变是不够的,他还必须能够做更多的事情.复用 ...
- Python面向对象的三大特性之继承和组合
继承和组合 一.组合 组合:组合指的是,在一个类中以另外一个类的对象(也就是实例)作为数据属性,称为类的组合 也就是说:一个类的属性是另一个类的对象,就是组合 例子: 圆环是由两个圆组成的,圆环的面积 ...
- Python - 面向对象编程 - 三大特性之多态
前置知识 封装 详解文章:https://www.cnblogs.com/poloyy/p/15203989.html 封装根据职责将属性.方法封装到一个抽象的类中 定义类的准则-封装 继承 详解文章 ...
- python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试
一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...
- Java学习笔记二十一:Java面向对象的三大特性之继承
Java面向对象的三大特性之继承 一:继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方 ...
- Python 面向对象的三大特性
面向对象的三大特性:继承,封装,多态 什么时候用封装: 同一种功能的时候, 譬如:把一部分数据或方法,封装到同一个类的中 PS:在构造方法中,原始数据中....
- Python 面向对象的三大特性:封装,继承,多态
# 面向对象的三大特性:封装,继承,多态 # 继承的影响:资源的继承,资源的使用,资源的覆盖,资源的累加 # 资源的继承,在Python中的继承是指能使用父类的资源,而不是说在子类也复制一份父类代码到 ...
- Python面向对象初始(三大特征,多态,继承,封装)
Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...
随机推荐
- 第4天 JavaDoc生成文档&Java流程控制(第一节:用户交互Scanner)
JavaDoc生成文档 javadoc命令是用来生成自己的API文档 参数信息: @author 作者名 @version 版本号 @since 指明需要最早使用的jdk版本 @param 参数名 @ ...
- 流畅的python--装饰器
装饰器:以某种方式增强函数.两大特性:1.可以将被装饰的函数替换成其他函数. 2.在加载模块时立即执行.案例1def make_avarage(): count=0 total=0 def avera ...
- springmvc学习指南 之---第24篇 国际化问题
writedby 张艳涛,今天一天就搞了一个这个问题,主要是下路,遇到springmvc-config.web的配置和拦截器的使用问题, 看了几天的spring发现都没讲拦截器,之前看了两天sprin ...
- 原来select语句在MySQL中是这样执行的!看完又涨见识了!这回我要碾压面试官!
大家好,我是冰河~~ MySQL作为互联网行业使用最多的关系型数据库之一,与其免费.开源的特性是密不可分的.然而,很多小伙伴工作了很多年,只知道使用MySQL进行CRUD操作,这也导致很多小伙伴工作多 ...
- Pdb— Python的调试器
参考:Pdb- Python的调试器 pdb 模块定义了一个交互式源代码调试器,用于 Python 程序.它支持在源码行间设置(有条件的)断点和单步执行,检视堆栈帧,列出源码列表,以及在任何堆栈帧的上 ...
- javascript的入门学习
目录 JavaScript的学习 什么是javascript,如下简称JS 正式使用js js的两种引入方式 head标签与body标签的区别 js定义变量 可以分为如下四种类型: 有3种特殊的数据类 ...
- 自学linux——5.网络设置
网络设置 1.网卡配置文件位置:ls /etc/sysconfig/network-scripts/ 2.网卡配置文件命名:ifcfg-网卡名称 3.查看网卡配置文件:cat /etc/sysconf ...
- Java面向对象02——回顾方法(定义、调用)及加深
方法的定义 package oop.demon01; //Demon01 类 public class Demon01 { //main 方法 public stati ...
- 100的累加和 while 循环
//100的累加和 while 循环 #include <stdio.h> int main() { int sum = 0; //5050 int i = 0; while(i < ...
- 深入理解Https如何保证通信安全
作为一名ABC搬运工,我相信很多人都知道Https,也都知道它是用来保证通信安全的,但是如果你没有深入了解过Https,可能并不知道它是如何保证通信安全的.我也是借着这次机会,和大家分享下我深入了解的 ...