前言:

继承是面向对象的3大特性之一,对于继承一点要注意一下4点。

一、基本查找

如果子类继承了父类,子类的实例化对象,没有的方法和属性会去父类找

class Parent(object): #父类
def f1(self):
print('f1') class Sub(Parent): #子类
pass obj=Sub() #如果子类继承了父类,子类的实例化对象,没有的方法和属性会去父类BAR()
obj.f1()

二、多继承查找顺序

python中的类支持继承多个类,在Java和C#中则不会存在;

如果Python中的类如果继承了多个类,其寻找方式无非2种,分别是深度优先,广度优先;

pyton2如果没有继承object默认使用的是经典类:所有经典类使用深度优先的算法查找顺序

Python3默认使用新式类:所有经典类使用广度优先的查询顺序:1次查找留头,在去第二条支路上找到头;

1、python3新式类继承顺序:

a、2条支路通往1个头   python3中的类属于新式类,首次查找规则是广度优先(从左往右找)

MRO图:

继承顺序:

新式类:F-->D--->B(不会找到头留1个,去右边找E)  | E--->C--->A--->object

经典类:F-->D-->B-->A--->E--->C

代码:

#新式类的继承,在查找属性时遵循广度优先
class A(object):
def test(self):
print('from A') class B(A):
# def test(self):
# print('from B')
pass class C(A):
def test(self):
print('from C')
pass class D(B):
# def test(self):
# print('from D')
pass class E(C):
def test(self):
print('from E') class F(D,E): #注意多继承一定要遵循 MRO图顺序,不能先继承父类,还继承父类的子类 例:class F(A,B/C/D/E)都会报错
# def test(self):
# print('from F')
pass f1=F()
f1.test()
# F-->D--->B(不会找到头)留1个)--->E--->C--->A--->object 广度优先

b、如果3条支路通往1个头

MRO图:

继承顺序:

新式类:H-->E--->B-->F-->C-->G-->D-->A

经典类:H-->E-->B-->A-->F-->C-->G--D

代码:

class A(object):
def test(self):
print('from A')
pass class B(A):
# def test(self):
# print('from B')
pass class C(A):
# def test(self):
# print('from C')
pass class D(A):
# def test(self):
# print('from D')
pass class E(B):
# def test(self):
# print('from E')
pass class F(C):
# def test(self):
# print('from F')
pass class G(D):
# def test(self):
# print('from G')
pass class H(E,F,G):
# def test(self):
# print('from H')
pass h1=H()
h1.test()

c、如果有2条之路就意味着有2个源头,支路1到头,支路2到头

MRO图:

继承顺序:

新式类: F-->D--->B-->X(走到头) | E--->C--->C--->Y--->object(走到头)

经典类: F-->D--->B-->X(走到头) | E--->C--->C--->Y--->object(走到头)

 代码:

class X(object):
def test(self):
print('from X')
pass class Y(object):
def test(self):
print('from Y')
pass class B(X):
# def test(self):
# print('from B')
pass
class C(Y):
def test(self):
print('from C')
pass
class D(B):
# def test(self):
# print('from D')
pass
class E(C):
def test(self):
print('from D')
pass class F(D,E):
# def test(self):
# print('from F')
pass f1=F()
f1.test()

三、继承关系混乱不遵循CRO

注意多继承一定要遵循 MRO图顺序,不能先继承父类,还继承父类的子类 例:class F(A,B/C/D/E)都会报错

四、self是到底谁?

为什么B类中没有f2方法却可以执行呢,一定要明白self对象是谁的实例?

obj对象没有f1方法,就去self对象对应的类开始找

obj对象没有f2方法,也去self对象对应的类开始找

class A(object):
def f2(self):
print('A.f2') class B(object):
def f1(self):
print('B.f1')
self.f2() #为什么B类中没有f2方法却可以执行呢,一定要明白self对象是谁的实例?
#obj对象没有f1方法,就去self对象对应的类开始找
#obj对象没有f2方法,也去self对象对应的类开始找
class C(A):
def f1(self):
print('C.f1') class D(B):
def f2(self):
print('D.f1') class Foo(A,D):
pass obj=Foo()
obj.f1() #执行结果
# B.f1
# A.f2

Python面向对象之继承的更多相关文章

  1. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  2. Python面向对象编程——继承与派生

    Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...

  3. Python面向对象03 /继承

    Python面向对象03 /继承 目录 Python面向对象03 /继承 1. 初识继承 2. 单继承 3. 多继承 4. 总结 1. 初识继承 概念:专业角度:如果B类继承A类,B类就称为子类,派生 ...

  4. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  5. python面向对象编程 继承 组合 接口和抽象类

    1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...

  6. python面向对象的继承-组合-02

    *面向对象(OOP)的三大特征:**# 封装.继承.多态 继承 什么是继承 继承:# 是一种关系,描述两个对象之间什么是什么的什么的关系 例如:麦兜.佩奇.猪猪侠.猪刚鬣,都是猪 为什么要使用继承 继 ...

  7. python 面向对象之继承与派生

    一:初识继承 1,什么是继承? 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类 ...

  8. python面向对象之继承/多态/封装

    老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...

  9. python面向对象之继承与派生

    一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的 ...

  10. 十七、Python面向对象之继承

    在面向对象,继承是一个很重要的特性 子类与父类,子类是对父类的一种扩展,在父类的属性和方法上进行一些扩展 示例:没带继承   #定义一个带编号和状态的门的类 class Door(object): d ...

随机推荐

  1. HDU 4496 D-City(逆向并查集)

    http://acm.hdu.edu.cn/showproblem.php?pid=4496 题意: 给出n个顶点m条边的图,每次选择一条边删去,求每次删边后的连通块个数. 思路: 离线处理删边,从后 ...

  2. bean之间的属性是怎么维护的

    spring对象[bean]之间的属性是通过什么维护的: 1.构造方法:标签:constructor-arg 2.set方法:标签:property <beans xmlns="htt ...

  3. 用html+css+js实现选项卡切换效果

    文章转载自:http://tongling.github.io/JSCards/ 用html+css+js实现选项卡切换效果 使用之前学过的综合知识,实现一个新闻门户网站上的常见选项卡效果: 文字素材 ...

  4. Selenium 页面自动化测试 面试 问题汇总

    1.   专业技术 在学习完Selenium的大部分接口或者方法之后,你可能会去面试自动化测试,主要是Selenium的自动化测试.下面这些问题总结,可能会对你有所帮助. 什么是Selenium? S ...

  5. mysql5.7.23手动配置安装windows版

    1.mysql下载地址 官网:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 官网我下载的是: 百度网盘:链接: https://pa ...

  6. Django 操作Mysql数据库

    pip安装mysqlclient sudo ln -s /usr/local/mysql/bin/mysql_config /usr/local/bin/mysql_config sudo pip i ...

  7. The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

    关于出现这个·问题的原因貌似也是多种多样的? 在stack overflow上的帖子如下:https://stackoverflow.com/questions/43186315/tomcat-404 ...

  8. 你想了解Go语言开发吗?

    大家先了解一下什么是Go语言? Go语言是谷歌2009发布的第二款开源编程语言.Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全.支持 ...

  9. JAVA基础知识总结:十七

    一.转换流 作用:实现将字节流转换为字符流 a.InputStreamReader:字节字符转换输入流:字节输入流----->字符输入流 b.OutputStreamWriter:字节字符转换输 ...

  10. PHP中json数组与对象的问题

    在PHP后端,对于数组和对象的区分不是很大,主要用到的数组居多,而PHP提供接口时响应的一般是json数据(为什么使用json呢,总体来说就是体积小速度快).但是前端对数组对象很'敏感',所以对PHP ...