前言:

继承是面向对象的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. Md5混淆因子

    package cn.springmvc.utils;import org.apache.commons.codec.digest.DigestUtils;import org.apache.comm ...

  2. _instance_reset

    制作多功能Item.creature及gameobject 中第19个功能 重置副本,关联到该表. 当该表中配置,且玩家有这个副本这个难度的进度时,功能宝石中会出现该副本的名字,点击可以重置副本 ma ...

  3. java环境变量怎么配置

    我们在学习java的时候,必须先来配置一下java的环境变量,也许你不懂什么是java环境变量,我们也不需要懂,你只要知道,java环境变量配置好了,你的电脑就能编译和运行java程序了,这显然是你想 ...

  4. java之双缓冲的代码粘贴

    private Image offScreenImage = null; public void update(Graphics g) { if(offScreenImage == null) off ...

  5. 学习笔记32—python常见问题及解决办法

    1.Anaconda3 中 Spyder 无法打开/点击没有反应 应对方法 1).通过pip安装pyqt5:pip install pyqt5 2).输入以下命令:spyder --new-insta ...

  6. JS中innerHTML、outerHTML、innerText 、outerText、value的区别与联系?jQuery中的text()、html()和val()

    一.JS中innerHTML.outerHTML.innerText .outerText.value的区别与联系?jS中设置或者获取所选内容的值:①innerHTML :属性设置或返回该标签内的HT ...

  7. Lua和C++交互 学习记录之五:全局数组交互

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...

  8. angular 拦截器

    介绍:$http service在Angular中用于简化与后台的交互过程,其本质上使用XMLHttpRequest或JSONP进行与后台的数据交互.在与后台的交互过程中,可能会对每条请求发送到Ser ...

  9. 日常英语---二、注册google的api的key

    日常英语---二.注册google的api的key 一.总结 一句话总结:register google api key register_google_api_key 1.请通过电子邮件向我发送有关 ...

  10. FreeRTOS

    一.内核配置 1.configUSE_PREEMPTION 设置为1,使用抢先式内核:设置为0,为合作轮转内核. 2.configCPU_CLOCK_HZ 内部处理器执行的频率.这个值需要正确配置外围 ...