前言:

继承是面向对象的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. python3 session cookie

    session是保存在服务器中的,而cookies是保存在客户端中的.服务器通过session id来跟踪客户,而对于客户端而言,session id是保存在cookies中的,所以只要把cookie ...

  2. open()、fwrite()、fread()函数使用说明与示例

    fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针. 2.函数原型: FILE * fopen(const char * path,const ...

  3. _faction

    一.自定义阵营独立于联盟,部落,联盟和部落玩家可以加入同一阵营 二._function_menu表可以配置自定义阵营开启 二.配合_pvp表,可以实现区域的自定义阵营PVP 三.配合_req表fact ...

  4. python函数的动态传参.作用域与命名空间

    一.动态传参1.*表示动态传参. 可以接受所有的位置参数传参的时候自动的把实参打包成元组 交给形参 def chi(*food): print(food) chi() # 动态传参可以不传参数 chi ...

  5. 小程序模板template

    WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用. 定义模板 使用 name 属性,作为模板的名字.然后在<template/>内定义代码片段,如: & ...

  6. PHP 的命令行模式

    php CLI SAPI 内置Web Server 从版本 4.3.0 开始,PHP 提供了一种新类型的 CLI SAPI(Server Application Programming Interfa ...

  7. VC.时间_ZC测试代码

    1. #include <windows.h> #include <stdio.h> void TimeNowZ( char* _pc ) { SYSTEMTIME sys; ...

  8. python + lisp hy的新手注记1

    想在python里用lisp方言hy的目的: 1 用lisp去parse 包含 “数据+简单if控制流(代码.AST)”的配置文件,或者说用包含s-exp的.hy文件作为这类配置文件的实现(而不是用y ...

  9. CSS opacity的兼容写法

    opacity{ opacity:0.5; filter:alpha(opacity=50);  //filter 过滤器   兼容IE678 }

  10. Appium解决搜索框问题

    appium解决搜索框: 1. 点击搜索,手工测试会弹出键盘,需要点击键盘上的搜索按钮. 2.但自动化的时候,键盘不能弹出.所以我们可以用回车等keycode代替搜索按钮. Press Keycode ...