Python_014(面向对象之继承)
一.面向对象之继承
1.初始继承
引入:面向对象的三大特性:继承,多态,封装
a.继承是创建新类的一种方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类;新建的类称为派生类和子类;
b:引入几个小程序:
class Animal:
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def eat(self,a1):
print('%s吃%s' % (self.name,a1))
def drink(self):
print('%s喝东西' % (self.name)) class Cat(Animal):
def miaow(self):
print('喵喵叫')
def eat(self): # 只执行自己类中的方法
print(666) class Brid(Animal):
def __init__(self, name,sex,age,wing):
# Animal.__init__(self, name, sex, age)
super().__init__(name,sex,age)
self.wing = wing
**从上面代码可以看出,Animal是父类(基类,超类),而Brid(子类,派生类)实例化的对象时候有三种情况需要注意
1)实例化的对象想要只执行父类的方法:那么在子类中就不要定义与父类同名的方法,因为它会先调用自己本类的这个方法;
2)实例化的对象想要只执行子类的方法:在子类中创建这个方法就行;若没有,才会去父类去找;
3)当实例化的对象既要执行子类的方法,又要执行父类的方法时,有两种解决办法;
a:第一种是第19行格式,将自己类中的__init__方法做为跳板,执行父类的__init__方法;传入参数,这里面不要忘了传入self(对象本身)
b:20行格式,用super()函数,函数里的super(Brid,self)可以省略;
二.继承的进阶
1.继承分为单继承,多继承(只有Python中有多继承概念),多继承又被称为砖石继承;
2.Python中类分为两种(经典类和新式类)
1)Python2中(既有新式类,又有经典类)所有类默认都不继承object类,都默认是经典类,你可以让它继承object类,转为新式类
2)Python3中(只有新式类),所有类都默认继承object类;
**补充知识点,object类中有__init__()方法,这也是你为什么在类中不写__init__()方法不会报错的原因;
3.单继承:经典类和新式类查询顺序一样;
class A:
pass
def func(self):
print('IN A')
class B(A):
pass
def func(self):
print('IN B')
class C(B):
pass
def func(self):
print('IN C')
c1 = C()
c1.func()
a:经典类查询顺序: C->B->A b:新式类查询顺序: C->B->A->object
4.多继承中查询顺序:
a;新式类:遵循广度优先,一条路走到倒数第二级,判断如果有其他路走到,则返回走另一条路,如果没有,则走到终点;

b:多继承的经典类:深度优先:一条路走到底;如果一条走到头没找到,在选择另外一条路;
**小知识:用类名.miro()查找类的广度优先顺序;
总结:继承的优点:1)提高了代码的复用性 2)提高了代码的维护性 3)让类与类之间产生了关系,是多态的前提;
补充知识点:Python的继承体系mro详解
引入mor之后,按照c3算法,进行线性化;
原理:
#首先找到A继承的三个类的深度继承顺序,放到一个列表中
L[B] = [B,D,F,H] #B往上面的继承顺序
L[C] = [C,E,G,H] #C往上面的继承顺序
L[D] = [D,F,H] #D往上面的继承顺序
#第二步:A自己的广度,第一层
L[A] = [B,C,D]
list = [A,B,C,D,F,E,G,H,O]
#每个列表的第一个元素为头部,从第一个列表的头部开始找,找其他列表中尾部是否含有
这个类名,如果没有,提取出来放到一个列表中,如果有,找下一个列表的头部,循环下去
只要提取来一个,我们就从第一个列表的头部接着重复上面的操作.
1 [B,D,F,H] [C,E,G,H] [D,F,H] [B,C,D]
2 [D,F,H] [C,E,G,H] [D,F,H] [C,D] #提取了头部的B,然后将其他列表头部的B删除,并将B放到list中
3 [D,F,H] [E,G,H] [D,F,H] [D] #因为第一个列表的D在其他列表的尾部存在,所以跳过D,然后找第二个列表的头部C,提取了头部的C,然后将其他列表头部的B删除,并将B放到list中
如下图所示:
class H:
def func(self):
print('inH')
class G(H):
def func(self):
print('inG')
class F(H):
def func(self):
print('inF')
class E(G):
def func(self):
print('inE')
class D(F):
def func(self):
print('inD')
class C(E):
def func(self):
print('inC')
class B(D):
def func(self):
print('inB')
class A(C,F,H):
def func(self):
print('inA')
r = A()
print(A.mro())

所以列表为: B:[B,D,F,H] C;[C,E,G,H] D:[D,F,H] A[B,C,D] 所以按照c3算法找
最后结果为 A B C D F E H O
Python_014(面向对象之继承)的更多相关文章
- 黑马程序员_Java面向对象2_继承
4.面向对象_继承 4.1继承的概述 提高了代码的复用性. 让类与类之间产生了关系,有了这个关系,才有多态的特性. 注意:千万不要为了获取其他类的功能而去继承,简化代码而继承.必须是类与类之间有所属关 ...
- C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域
面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...
- 【Java基础】【08面向对象_继承&方法&final】
08.01_面向对象(代码块的概述和分类)(了解)(面试的时候会问,开发不用或者很少用) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以 ...
- php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
1.面向对象 封装继承多态 接口.重载.抽象类.最终类 面向对象 封装继承多态 首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...
- 面向对象多继承(c3算法)、网络基础和编写网络相关的程序
一.面向对象多继承(c3算法) a.有多个父类先找左,再找右,如下示例: class A(object): pass class B(object): def f1(self): print('B') ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- python之面向对象(继承)
类的继承 python之面向对象(继承) 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制.继承完全可以理解成类之间的类型和子类型关系. 需要注意的地方:继承语法 c ...
- python面向对象编程 继承 组合 接口和抽象类
1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...
- Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类
一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...
随机推荐
- Win7下64位机安装SQL2000
win7下64位机安装SQLSERVER20001.右击计算机属性,查看操作系统 2.打开安装文件夹,按图点击 3.开始安装 4. 下一步选择 安装SQL Server2000 组件 5. 下一步 选 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第8节 Math类_19_Math练习:小学数学真题
题目 画数轴 解题思路 强转成int类型就会舍弃小数位数 输出最终的数量 如果用Math.ceil的方式的话
- 测开之路九十八:js变量和语句
这里为了方便调试,在jsbin网站上面编写js脚本:https://jsbin.com/?js,console 可以点击增加/减少对应展示分页,Console为控制台部分,Output为页面部分 变量 ...
- ssm项目的创建思路
·DAO层: 代码:pojo.映射文件.接口文件——Mybatis逆向工程自动生成 配置:ApplicationContext-dao.xml——数据源.连接池.会话工厂.mapper包扫描 ·Ser ...
- 应用安全 - 安全设备 - WAF原理/检测/绕过
原理 基于Cookie值 Citrix Netscaler(2013年使用广泛) “Citrix Netscaler”会在HTTP返回头部Cookie位置加入“ns_af”的值,可以以此判断为Citr ...
- gitee.ZC_blog快速方案
1. 1.1.改 hexo的配置文件中 gitee的路径 复制URL,到hexo的配置文件_config.yml …… deploy: type: git # type为git repo: https ...
- 20190906 On Java8 第十八章 字符串
第十八章 字符串 +的重载与StringBuilder 用于String的+与+=是Java中仅有的两个重载过的操作符,Java不允许程序员重载任何其他的操作符.编译器自动引入了java.lang.S ...
- Mybatis-第N篇配置log4j1、log4j2打印执行的sql语句
1.log4j1配置 目录结构: conf.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...
- Weak Pair (dfs+树状数组)
Weak Pair (dfs+树状数组) 题意 这个题目是要求:一颗树上,有n个节点,给出每个节点的权值.另外给出一个值k,问有多少对节点满足: \(power[u]*power[v]<=k\) ...
- [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)
[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...