Python学习:15.Python面向对象(二、继承的各种情况)
一、什么是继承
继承是一种创建类的方法,在python中,一个类可以继承来自一个或多个父。原始类称为基类或超类。
#创建父类
class Parent1:
pass class Parent2:
pass # 继承父类,单继承
class Obj1(Parent1):
pass #继承父类,多继承
class Obj2(Parent1,Parent2):
pass
二、什么时候使用继承
在已经创建的几个类中,这几哥类中的方法和变量有相同的,这种时候我们就可以使用类的继承,将其它类中已有的方法和变量通过继承的方式,在新创建的类中,使用正常的方式就可以调用父类中的方法。剩下自己特有的方法只要在自己类中定义就可以。
举个列子:人都会吃,喝,玩,小明也是一个人,所以小明也会,所以小明继承了人的属性,特别的是小明还会背古诗,就基于以上的说法写一个类的继承。
class Man:
def eat(self):
print('吃')
def drink(self):
print('喝')
def play(self):
print('玩')
class XiaoMing(Man):
def recite(self):
print('背古诗')
xm = XiaoMing()
xm.eat()
xm.recite()
输出结果:
吃
背古诗
三、单继承与多继承
单继承:仅仅继承一个父类,当查找方法的时候,首先在自己里面查找,然后到父类里面查找。
class Biology:
def split(self):
print(self.name+" accrue") class Animal(Biology):#在类后面加括号加上所要继承类的名字,继承的是类的方法
def GoWhoring(self):
print("i like go whoring")
def eat(self):
print(self.name+" eat") class superman:
def gamble(self):
print("gamble is interesting")
def GoWhoring(self):
print("beautiful whoring") class Cat(Animal):
def GoWhoring(self):
print("i don't like go whoring")
def __init__(self,name):
self.name = name
def cry(self):
print(self.name + " 喵")
#优先级:自己,父类(左边,右边)
class Dog(Animal,superman):#在继承多个父类时,在两个父类都有同一个名字的方法时,优先选择括号左边的父类的方法
def __init__(self,name):
self.name = name
def cry(self):
print(self.name + " 汪") mimi = Cat("mimi")
mimi.eat()
mimi.cry() #当基类里方法存在,派生类里也存在同名方法,优先找派生类里的方法
mimi.GoWhoring() #当父类里有一个方法自己也有一个同名的方法时,默认使用自己的方法
husike = Dog("erha")#虽然Dog里没有eat和split但是由于Dog继承了Animal和的方法,而Animal继承了Biology的方法
husike.eat() #所以Dog可以使用Biology的方法
husike.cry() #父类有一个名字叫"基类" 子类有一个名字叫"派生类"
husike.split()
husike.GoWhoring()
faker = Animal()
faker.GoWhoring()#优先使用自己的方法
派生类可以继承基类里的所有功能。
当基类里方法存在,派生类里也存在同名方法,派生类优先找派生类里的方法(意思是优先找自己的)。
在Java、C#里面一个子类只能继承一个父类,多了报错,但是在python里可以继承多个父类
在经典类中,继承是以深度优先,在新式类中,继承是以广度优先。
Python 2.x中默认都是经典类,只有显式继承了object才是新式类。
python 3.x中默认都是新式类,经典类被移除,不必显式的继承object。
深度优先:
class A():
def save(self):
print("This is from A")
class B(A):
pass
class C(A):
def save(self):
print("This is from C")
class D(B,C):
pass fun = D()
fun.save() 输出结果:
This is from A"
深度优先的时候就是一条道走到黑,从左向右找,先把左边的一个里面的全部找完在找右边的。
广度优先:
class A():
def save(self):
print("This is from A")
class B(A):
pass class C(A):
def save(self):
print("This is from C")
class D(B,C):
pass fun = D()
fun.save() 输出结果:
This is from C
首先在左边的上一层父类中寻找,如果没有就到右边一个父类中寻找,没有就到左边父类的父类中寻找。
广度优先多种情况解析
情况一
有A、B、C、D、E几个类,A为B的父类,B为C的父类,E为D的父类,D为C的父类 现在C需要使用一个方法,只有在A,E里有,第一次C先去B中寻找没有找到 然后就会去A里面找,A里没有就去D里面找,然后再去E里找。
class A:
def function(self):
print("are you OK?A") class B(A):
def function_fake(self):
print("are you OK?B") class E:
def function(self):
print("are you OK?E") class D(E):
def function_fake(self):
print("are you OK?D") class C(B, D):
def Sb(self):
print("i am sb") faker = C()
faker.function() 输出结果:
are you OK?A

括号里为查找顺序。
情况二
它会先把没有共同的父类寻找玩,然后再找共同的父类,因为在这种情况下它想找到和自己关系最近的。
class S:
def function(self):
print('are you Ok?S') class A(S):
def function_fake(self):
print("are you OK?A") class B(A):
def function_fake(self):
print("are you OK?B") class E(S):
def function(self):
print("are you OK?E") class D(E):
def function_fake(self):
print("are you OK?D") class C(B, D):
def Sb(self):
print("i am sb") faker = C()
faker.function() 输出结果:
are you OK?E

情况三
当A、B、D、E、都没有C所要找的函数时才会找右边的F(括号右边)
class F():
def function(self):
print("are you OK?F") class A:
def function_fake(self):
print("are you OK?A") class E:
def function_fake(self):
print("are you OK?E") class B(A,F):
def function_fake(self):
print("are you OK?B") class D(E):
def function_fake(self):
print("are you OK?D") class C(B, D):
def Sb(self):
print("i am sb") faker = C()
faker.function() 输出结果:
are you OK?F

情况四
首先面执行一个 c1 = C();c1.xxx() ,xxx在D里面而且xxx又执行了self.ooo() 而ooo在BDE里都有它会执行哪个?
class B:
def ooo(self):
print("B") class E:
def ooo(self):
print("E") class D(E):
def xxx(self):
self.ooo() def ooo(self):
print("D") class C(B, D):
pass c1 = C()
c1.xxx() 输出结果:
B
解析:首先找到c1.xxx在D里面,在D里面又执行了self.ooo(),这个self代指c1,而c1为C类的对象,意思还是c1.ooo,所以寻找ooo时还是从C开始,因为先找左边的所以,找到了B的ooo 以后找是谁执行的函数要看准self到底是谁的从self下手。

红色为第二次寻找路径(寻找ooo方法的次序)
今天的类的继承主要是多继承的时候父类中方法选择的。
Python学习:15.Python面向对象(二、继承的各种情况)的更多相关文章
- Python学习-15.Python的中的套接字socket
Python应用最广泛的要数web方面了.因此,socket显得十分重要. 要使用socket,必须引入socket模块,因此在Python脚本开头先写入 import socket 学过socket ...
- Python进阶(十五)----面向对象之~继承(单继承,多继承MRO算法)
Python进阶(十五)----面向对象之~继承 一丶面向对象的三大特性:封装,继承,多态 二丶什么是继承 # 什么是继承 # b 继承 a ,b是a的子类 派生类 , a是b的超类 基类 父类 # ...
- 《Python学习手册》(二)
<Python学习手册>(二) --类型和运算 数字 十六进制 八进制 二进制 0x 0o 0b hex() oct() bin() >>>int('10',2) 2 & ...
- Python学习day09 - Python进阶(3)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day05 - Python基础(3) 格式化输出和基本运算符
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- python 学习day6(面向对象)
博客部分内容转自:http://www.cnblogs.com/wupeiqi/p/4493506.html 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法 ...
- python学习笔记(10):面向对象
一.类和实例 1.类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 2.对象:通过类定义的数据结构实例.对象包括两个数据成员( ...
- Python学习系列之面向对象
概述 一.Python编程方式 面向过程编程:根据业务逻辑从上到下磊代码 面向函数编程:将某功能代码封装到函数中,将来直接调用即可,无需重新写 面向对象编程:对函数进行分类.封装 二.面向过程编程 w ...
- python学习笔记(7): 面向对象
class Foo: #类中的函数 def bar(self): #功能阐述 print('Bar') pass def hello(self,name): print('i am %s' %name ...
- Python学习之路--面向对象
1.面向对象概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向 ...
随机推荐
- 沉淀再出发:java中线程池解析
沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...
- SRAM(静态)存储器芯片的读/写周期
一. 要保证正确地读/写,必须注意CPU时序与存储器读/写周期的配合.一般存储器芯片手册都会给出芯片读/写周期的时序图. Intel 2114芯片的读.写周期时序如图所示. 二. 读周期 读操作时,必 ...
- 021.2 IO流——字节输出流
内容:流的分类,文件写入(字节输出流),异常处理,获取一个文件夹下的特定文件集合 字节流的抽象基类:InputStream,OutputStream字符流的抽象基类:Reader,Writer由这四个 ...
- 两天学会css基础(二)
接上一篇博客,还有css中的两个重要知识点没有说到,就是元素的浮动与定位. 第三部分:元素的浮动与清除 这部分的内容之前的博客已总结过.请查看css中的浮动与三种清除浮动的方法这篇文章. 浮动在网页中 ...
- Windows和Linux环境,网络异常模拟测试方法【转载自光荣之路微信公众号】
1.网络异常的分类 在系统的运行过程中,可能会遇到各种各样的网络问题,其中主要可能出现的问题有 网络延迟:当网络信息流过大时,可能导致设备反应缓慢,造成数据传输延迟: 网路掉包:网路掉包是在数据传输的 ...
- python一键对应多个值
背景:目前是想让一个取出来的数据,数据有2个或多个值,对应一个key,或者这样说:让一个键对应2个值或者3个值 实现方式,如下:目前我以读取xml文件为案例,读取xml中两个配置文件,存放到一个key ...
- [SDOI2016]数字配对
题目 发现要求配对的条件是这样 \[a_j|a_i,\frac{a_i}{a_j}=p_1\] 我们考虑一下再来一个\(a_k\),满足 \[a_k|a_j,\frac{a_j}{a_k}=p_2\] ...
- [POI2006]TET-Tetris 3D
题目 二维线段树板子题啊 但是惊讶的发现我不会打标记 毕竟内层是线段树不能\(pushup\)也不能\(pushdown\) 于是考虑一下标记永久化 其实非常显然\(mx_i\)表示区间最大值,\(t ...
- python中的类(二)
python中的类(二) 六.类的成员 字段:普通字段,静态字段 eg: class Province(): country=’中国’ #静态字段,保存在类中,执行时可以通过类或对象访问 def __ ...
- [USACO11JAN]Roads and Planes
嘟嘟嘟 这道题他会卡spfa,不过据说加SLF优化后能过,但还是讲讲正解吧. 题中有很关键的一句,就是无向边都是正的,只有单向边可能会有负的.当把整个图缩点后,有向边只会连接在每一个联通块之间(因为图 ...