DAY18 面向对象三大特性之继承
继承
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类。父类又被称为超类,基类;新建的类称为子类或者派生类。
在python3.x版本中,所有的类都默认继承object类。
1.继承与重用
首先,我们来看看一个例子:
# 猫类:吃喝睡,爬树
# 狗类:吃喝睡,看家#一。通过之前对面向对象的学习,我们可以轻易的定义出这两个类来:
class Cat:def __init__(self,name,kind,food):self.name = nameself.kind = kindself.food = fooddef eat(self):print('%s吃%s'%(self.name,self.food))def drink(self):print('%s喝水'%self.name)def sleep(self):print('%s在睡觉'%self.name)def climb(self):print('%s在爬树'%self.name)class Dog:def __init__(self,name,kind,food):self.name = nameself.kind = kindself.food = fooddef eat(self):print('%s吃%s'%(self.name,self.food))def drink(self):print('%s喝水'%self.name)def sleep(self):print('%s在睡觉'%self.name)def look_after_home(self):print('%s在看家'%self.name)
但是再往深入探讨,我们会发现其实编写的猫类和狗类代码中,很多都冗余代码。有什么方式能够把重复的代码提取出来吗?当然有,这时候就可以用到继承的思想,父类中的所有属性和方法都可以被子类使用。
#二。把冗余的代码提出来,抽象出一个宠物类,让猫类和狗类都继承这个宠物类。
class Pet:def __init__(self,name,kind,food):self.name = nameself.kind = kindself.food = fooddef eat(self):print('%s吃%s'%(self.name,self.food))def drink(self):print('%s喝水'%self.name)def sleep(self):print('%s在睡觉'%self.name)class Cat(Pet):def climb(self):print('%s在爬树'%self.name)class Dog(Pet):def kanjia(self):print('%s在看家'%self.name)tom = Cat('Tom','暹罗猫','猫粮') #子类使用名字(静态变量和方法),如果在子类中没有,就使用父类的
hei = Dog('小黑','二哈','狗粮')tom.climb()
hei.kanjia()
2.继承与派生
子类也可以定义自己特有的属性或者重新这些属性(但并不会影响到父类),一旦定义了自己的属性且与父类同名时,这种属性称为派生属性。子类的对象调用这个属性时,会直接选择子类中的。
class Pet:def __init__(self,name,kind,food):print('IN PET')self.name = nameself.kind = kindself.food = fooddef eat(self):print('%s吃%s'%(self.name,self.food))def drink(self):print('%s喝水'%self.name)def sleep(self):print('%s在睡觉'%self.name)class Cat(Pet):def __init__(self,name,kind,food,eye_color):print('IN CAT')self.eye_color = eye_color #派生属性# Pet.__init__(name,kind,food)super().__init__(name,kind,food) #super方法,可以省去selfdef climb(self):print('%s在爬树'%self.name)class Dog(Pet):def kanjia(self):print('%s在看家'%self.name)tom = Cat('阿猫','橘猫','猫粮','绿色')
print(tom.eye_color)
# 派生经典考题:
class Foo:def __init__(self):self.func()def func(self):print('in tho foo')class Son(Foo):def func(self):print('in the son')s1 = Son()
>>>
in the son################
当self去调用某个方法的时候,不要看self在哪里,而是要明确self代表的到底是谁。
派生总结:
1.当子类中方法要被调用的时候,子类的对象会直接选择子类中的方法。
2.父类的方法不会被自动执行。
3.如果我们既要执行子类的方法又要执行父类中的方法,那么需要在子类的方法中调用父类的方法,有以下两种方法:
(1)父类名.方法名(self,参数...)
(2)super().方法名(参数...) #关于super的查找顺序,请继续往下看。
3.抽象类
抽象类在python中使用的不是特别多,但是在以后的工作中,公司有可能会使用抽象类来制定开发的规则,在以后看源码的过程中,也可能会碰到抽象类的概念。试想一个场景:在今后的多人开发,功能复杂,许多后期拓展功能的项目中,代码的规范变得尤其的重要,而此时,抽象类就能够起到一个很好的模板作用。
抽象类只是一个模板的规范,基本不会实现什么功能,所以抽象类是不可以被实例化的。
#定义抽象类,需要引入一个模块。from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta): #抽象类必须继承一个叫ABCMeta的类@abstractmethod #抽象类规定的方法,用abstractmethod装饰器装饰,规定了def pay(self):pass 后面凡是继承该抽象类的子类都必须有一个同名的方法。class Alipay(Payment):def pay(self,money):print('使用支付宝支付了%s元'%money)
4.多继承
在python中允许一个子类是可以继承多个父类的。
class ParentClass1: #定义父类1passclass ParentClass2: #定义父类2passclass ChildClass(ParentClass1): #定义子类(继承父类1) 单继承passclass ChildClass2(ParentClass1,ParentClass2): #多继承pass
“__base__”:显示子类的一个父类。
“__bases__”:显示子类的所有父类。
5.新式类与经典类
python3.x所有的类都是新式类,所有的新式类都有一个默认继承的父类,叫做object类。
python2.7中经典类和新式类并存。
class Student:Pass #经典类
class Student(object):pass #新式类
总结:
(1)继承了object的类都是新式类。
(2)在py3中所有的类都是新式类。
(3)在py2中既有新式类也有经典类。
一.多继承的顺序/新式类和经典类之间的区别?
(1)钻石继承:广度优先。
新式类的所有多继承关系寻找方法的顺序--->遵循广度优先。
mro()--->显示多继承的继承顺序。
super()--->super方法不是单纯的寻找父类,在多继承中,是遵循mro循序的。
class A:def func(self):print('A')class B(A):def func(self):super().func()print('B')class C(A):def func(self):super().func()print('C')class D(B,C):def func(self):super().func()print('D')d = D()
d.func()
print(D.mro()) #新式类遵循广度优先。
>>>
A
C
B
D
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
总结:
新式类在多继承时,遵循广度优先。
经典类在多继承时,遵循深度优先。
转载于:https://www.cnblogs.com/hebbhao/p/9549579.html
DAY18 面向对象三大特性之继承相关推荐
- 大数据必学Java基础(四十):面向对象三大特性之一继承(Inheritance)
文章目录 面向对象三大特性之一继承(Inheritance) 一.列举案例说明 1.类是对对象的抽象
- java 面向对象三大特性之继承 万字详解(超详细)
目录 前言 : 一.为什么需要继承: 二.什么是继承(Warning : 篇幅较长)? 1.继承概述: 2.子类继承父类之后达到的效果 : ①如何使用继承? ②代码演示 : 3.继承的使用场景: eg ...
- C++——面向对象三大特性之继承
文章目录 继承概念 继承的定义 继承的语法格式 继承方式 继承方式的汇总 赋值兼容规则 基类对象和派生类对象的赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 菱形继承 虚继 ...
- 面向对象三大特性(继承)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.今日回顾 1.<高等数学>:一节网课 2.阅读:<费马大定理>300页 3.英语:120个 ...
- 深入理解Java面向对象三大特性 封装 继承 多态
1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...
- Java面向对象三大特性(封装继承多态)解释及案例
文章目录 包 包基本语法 命名规则 命名规范 导入包实例 访问修饰符 面向对象编程-封装 面向对象编程-继承 super关键词 super和this的比较 方法重写/覆盖 (override) 注意事 ...
- python基础学习十四:面向对象三大特性之继承
一.继承的基本概念 Python面向对象的继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性和方法,具体如下: # ⽗类A class A(object):def __init__(self ...
- Day21 面向对象三大特性之继承
1.初识继承 什么是继承 继承是面向对象中的一个概念,是描述两个对象的关系,在程序中,继承描述的是类和类之间的关系 例如:a继承了b,a就可以使用b的属性和方法.a称之为子类,b称之为父类,也叫基类 ...
- python面向对象三大特性之继承
继承是创建新类的方法,以下是几个概念 父类,基类,超类: 被继承的类 子类,派生类:继承而产出的类 单继承:继承一个父类 多继承:继承多个父类 继承: 什么是什么的关系 父类中没有的属性,在字类中出现 ...
- python继承的特点_python面向对象三大特性之继承
继承是创建新类的方法,以下是几个概念 父类,基类,超类: 被继承的类 子类,派生类:继承而产出的类 单继承:继承一个父类 多继承:继承多个父类 继承: 什么是什么的关系 父类中没有的属性,在字类中出现 ...
最新文章
- Java类加载机制:双亲委托模型
- do msgbox loop_【连载1】DDC模块 DO点与强电电气柜的接口形式
- MDT跨网段UEFI部署系统
- 记录F1分数和召回率
- python在办公上的应用_python自动化办公:玩转word之样式秘笈
- 被江苏网警点名后 咪蒙发道歉信:公众号停更2个月 微博永久关停
- Linux系统安全保护措施
- 信息论基础(学习笔记整理)
- 机器学习的分类与主要算法
- ExamDiff Pro(电脑文件对比工具)官方正式版V12.0.1.8 | 最好用的文件对比工具之一文件内容对比工具下载
- smail语法 详解
- 保险核保、理赔|门诊住院发票识别||医疗单据医疗票据识别技术
- [actions] -- actions详细使用
- 可视化项目管理,项目进度管理必备工具
- 利用关联规则挖掘中医证素与恶性肿瘤的关系
- PS PhotoShop CS5 CS6 序列号 安装
- android设置UI界面背景,Android ROM定制——界面美化基础(framework-res、SystemUI修改)...
- 服装管理系统软件功能说明书
- 2021-12-3 温故而知新-JavaScript隐式转换
- 机器学习系列——机器学习三大类
热门文章
- MFC之添加PNG,JPG图片
- 【转】flex中的labelFunction(combox和dataGrid)
- WinSCP 提示:你的Shell可能与本程序不兼容(推荐使用Bash)。
- 那个高产似母猪的复旦计算机硕士
- 不要再闲玩啦!博主手把手带你两个月入门自然语言处理,还不赶紧碗里来!...
- 金融评分卡项目—7.申请评分卡中的数据预处理和特征衍生
- pandas—pd.DataFrame.sample
- 图论算法——有向图的邻接链表实现
- 如何高效工作,享受品质生活?看看少数派的经验总结吧
- 揭秘React同构应用