Day21 面向对象三大特性之继承
1.初识继承
什么是继承
继承是面向对象中的一个概念,是描述两个对象的关系,在程序中,继承描述的是类和类之间的关系
例如:a继承了b,a就可以使用b的属性和方法.a称之为子类,b称之为父类,也叫基类
为什么要使用继承
继承的一方可以使用被继承一方已有的东西,这样可以提高代码的重用性
如何使用继承
继承的基本语法
1 class A: 2 # 父类中的方法和属性 3 a = 1 4 def a1(self): 5 print('a1') 6 7 class B(A): 8 # 子类中的方法和属性 9 pass 10 b = B() # 实例化子类B的对象b 11 print(b.a) # 使用父类A中的属性 12 b.a1() # 使用父类A中的方法
2.抽象与继承
抽象即抽取一系列对象或类中相同的部分,从而形成一个新的类
抽象的两个层次:
1.将一系列具有相同特征和行为的对象抽取成类
2.将一系列具有相同属性和方法的类抽取成父类
继承是基于抽象的结果,通过编程语言实现它,先经历抽象的过程,才能通过继承的方法表达抽象的结果
正确的使用继承:
1.先抽象再继承
2.继承一个已经存在的类,扩展或是修改原始的功能
3.属性的查找顺序
属性的查找顺序:对象---->类---->父类---->父类的父类---->.....直到object
1 # 属性的查找顺序 2 class A: # 父类A定义了一个x 3 x = 1 4 5 class B(A): # 子类B也定义了一个x 6 x = 2 7 8 b = B() 9 print(b.x) # 在对象定义之前查找是查找子类B中 10 b.x = 3 # 对象也定义了一个x 11 print(b.x) # 定义x之后,是在对象的属性中查找
先去对象中找,找不到再去类中找,找不到再去父类中找,一直找到object为止,找不到就报错
4.派生与覆盖
什么是派生类
当一个子类中出现了与父类中不同的内容时,这个子类就称之为派生类.通常情况下,我们不可能写一个和父类完全一模一样的子类,这样就失去了子类的意义,我们都会加一些代码,所以子类基本都是派生类.
1 # 派生类 2 class Person: 3 def say_hi(self): # 父类中有一个方法 4 print('hi') 5 6 class Student(Person): 7 def say_hello(self): # 子类中也有一个新的方法 8 print('hello') # 此时这个子类就叫做派生类 9 10 s1 = Student() # 实例化一个类的对象 11 s1.say_hi() # 子类的对象可以调用父类的方法 12 s1.say_hello()
覆盖也称重写(overrides),当子类出现了和父类名称完全一致的属性或者方法时就叫做覆盖
1 # 覆盖 2 class Person: 3 x = 1 # 父类中有一个属性 4 def say_hi(self): # 父类中有一个方法 5 print('hi') 6 7 class Student(Person): 8 x = 2 # 子类中有一个同名的属性 9 def say_hi(self): # 子类中也有一个同名的方法 10 print('hello') 11 12 s1 = Student() 13 print(s1.x) # 打印的是子类中的属性 14 s1.say_hi() # 打印的是子类中的方法
5.子类访问父类的内容
访问的语法
语法: ```python 方式1: super(当前类名称,self).你要调的父类的属性或方法 方式2: super().你要调的父类的属性或方法 方式3: 类名称.你要调的父类的属性或方法(self) #方式3与继承无关 ```
子类访问父类的例子
1 # 子类访问父类的内容 2 class Person: 3 def __init__(self,name,age): 4 self.name = name 5 self.age = age 6 7 def eat(self): 8 print('%s会吃东西'%self.name) 9 10 class Student(Person): 11 def __init__(self,name,age,id): 12 # 第一种,父类名直接调用,这种方法什么地方都可以调用,与继承无关,并且需要写上对象本身 13 Person.__init__(self,name,age) 14 # 第二种,super(类名,对象本身),是python2内置的 15 super(Student,self).__init__(name,age) 16 # 第三种,python3做了优化可以内部不传参,推荐使用 17 super().__init__(name,age) 18 self.id = id 19 20 def eat(self): 21 super().eat() # 第三种方法在访问父类的方法 22 super(Student,self).eat() # 第二种方法在访问父类的方法 23 print('%s吃更好的东西'%self.name) 24 25 s1 = Student('sxc',18,188) 26 s1.eat()
初始化方法必须调用super
当你继承一个现有的类,并且你覆盖了父类的init方法时,必须在初始化方法的第一行调用父类的初始化方法,并传入父类所需的参数
需求:person父类中有name,age两个属性,子类student中我需要增加一个id的属性
1 # 继承中初始化方法必须调用super 2 class Person: 3 def __init__(self,name,age): 4 self.name = name 5 self.age = age 6 7 class Student(Person): 8 def __init__(self,name,age,id): # 当子类需要增加属性时,需要再初始化一次,这时会覆盖父类的初始化方法 9 super().__init__(name,age) # 子类初始化方法必须加super,这样就能导入父类的初始化方法 10 self.id = id # 增加了id属性,原属性也能访问 11 12 def say(self): 13 print('%s说我真帅'%self.name) # 如果不初始化方法不调用super,self.name就找不到,会报错 14 15 s1 = Student('sxc',18,1414) 16 s1.say()
练习:实现一个可以限制元素类型的容器(字符串,元组,列表,字典,集合)
1 # 实现一个可以限制元素类型的容器 (字典,列表,元组,集合,字符串) 2 class Newlist(list): 3 def __init__(self,kind): 4 super().__init__() # 调用父类的初始化方法 5 self.kind = kind 6 7 def append(self,obj): 8 if type(obj) == self.kind: 9 super().append(obj) # 调用父类的append方法 10 print('加入成功') 11 else: 12 print('类型错误') 13 14 n = Newlist(int) # 定义数据类型为int 15 n.append(123543) 16 print(n)
6.组合
组合是一种关系,描述两个对象之间有什么关系.将一个对象作为另一个对象的属性
组合一般都是在初始化方法时定义另一个对象
组合的目的:为了重用现有代码,提高代码的重用性
组合的例子
1 # 组合:一个类作为另一个类的属性,两者没有关联 2 # 定义一个英雄类 3 class Hero: 4 def __init__(self,name,ad,hp,weapon): 5 self.name = name 6 self.ad = ad 7 self.hp = hp 8 self.weapon = weapon # 英雄类和武器类没有关联,想要英雄类使用武器类,必须在初始化时就增加一个武器的属性 9 # def attack(self,enemy): 10 # enemy.hp -= self.ad 11 # print('%s攻击了%s,掉了%s血,血量还剩%s'%(self.name,enemy.name,self.ad,enemy.hp)) 12 13 # 定义一个武器类 14 class Weapon: 15 def __init__(self,name,att): 16 self.name = name 17 self.att = att 18 19 def weapon(self,hero,enemy): 20 enemy.hp -= self.att 21 print('%s使用了%s攻击了%s,掉了%s血,血量还剩%s' % (hero.name,self.name,enemy.name, self.att, enemy.hp)) 22 23 w1 = Weapon('无尽之刃',100) # 定义一把武器 24 h1 = Hero('亚索',50,500,w1) # 定义一个攻击者 25 h2 = Hero('提莫',20,400,w1) # 定义一个敌人 26 27 h1.weapon.weapon(h1,h2) # 英雄用武器攻击了另一个英雄
什么时候使用继承:一个类是否包含了另一个类,即什么是什么的关系
什么时候使用组合:两个类的关联不大,即什么有什么的关系
7.多继承的问题:菱形继承(了解)
新式类和经典类
新式类:任何直接或者间接的继承于object的类就称之为新式类.(python3中的类的顶部都是object,所以python3中全是新式类)
经典类:不是object的子类,只有python2中有
新式类的继承顺序,先深度遍历,当遇到共同的父类时就广度遍历
新式类的继承顺序还可以通过调用mro方法来查看
1 # 定义类 2 class A: 3 pass 4 5 class B: 6 pass 7 8 class C(A): 9 pass 10 11 class D(A): 12 pass 13 14 class E(B): 15 pass 16 17 class F(C): 18 pass 19 20 class G(D): 21 pass 22 23 class H(E,F,G): 24 pass 25 26 print(H.mro())
新式类的继承顺序:H---->E---->B---->F---->C---->G---->D---->A
经典类的继承顺序,全部都是深度遍历
经典类的继承顺序:H---->E---->B---->F---->C---->A---->G---->D
转载于:https://www.cnblogs.com/sxchen/p/11247659.html
Day21 面向对象三大特性之继承相关推荐
- 大数据必学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 ...
- python面向对象三大特性之继承
继承是创建新类的方法,以下是几个概念 父类,基类,超类: 被继承的类 子类,派生类:继承而产出的类 单继承:继承一个父类 多继承:继承多个父类 继承: 什么是什么的关系 父类中没有的属性,在字类中出现 ...
- python继承的特点_python面向对象三大特性之继承
继承是创建新类的方法,以下是几个概念 父类,基类,超类: 被继承的类 子类,派生类:继承而产出的类 单继承:继承一个父类 多继承:继承多个父类 继承: 什么是什么的关系 父类中没有的属性,在字类中出现 ...
最新文章
- HDU 1080 Human Gene Functions
- ie支持css3圆角实现的俩种方式
- 美国不要求计算机背景的学校,美国哪些院校计算机专业不需要CS背景
- 2021手机CIS技术趋势总结
- 项目已被os x使用 不能打开-黑苹果之路
- Python学习笔记-基本语法
- mfc opengl 三维地形图_衢州三维动画制作传媒企业哪家好2020收费
- 本地升级MySQL数据库版本为8.0.23,使用SQLyog(小海豚)无法进行连接
- 滚动页面一定距离后固定导航条
- Scrapy选择器和持久化
- The connection to adb is down, and a severe error has occured
- Qt开发之路——基于RedfishAPI的服务器管理小应用
- 第五节 comware概述
- WineQQ2012 最新下载
- 佐治亚理工计算机科学,Gatech的CS「佐治亚理工学院计算机科学系」
- win7系统提示“此windows副本不是正版” 解决方案
- snes9x 源码_仅64kb的SNES游戏如何制作优美的音乐
- FullCalendar-vue demo例子
- Freetype的基本应用
- 银监会计算机专业考试,)(2015国家公务员考试银监会计算机专业考试分析
热门文章
- 在Excel中创建目录
- 机器与人类视觉能力的差距(2)
- 火影603~630 不管是真的假的,写的够精彩的。
- 闺蜜恋上老公 最亲近的是最危险的
- 空心圆圈里的数字,实现
- android wear支付宝6,Android自定义View仿支付宝输入六位密码功能
- oracle 与mysql查询_oracle与mysql分页查询语句sql
- 魔兽8.0最新服务器人口普查,《魔兽世界》8.0人口普查:国服玩家132万,部落占优...
- 错误 C1900 “P1”(第“20150812”版)和“P2”(第“20130802”版)之间 Il 不匹配
- 蒟蒻成长之路(持续更新)