Python面向对象之继承
前言:
继承是面向对象的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面向对象之继承的更多相关文章
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- Python面向对象编程——继承与派生
Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...
- Python面向对象03 /继承
Python面向对象03 /继承 目录 Python面向对象03 /继承 1. 初识继承 2. 单继承 3. 多继承 4. 总结 1. 初识继承 概念:专业角度:如果B类继承A类,B类就称为子类,派生 ...
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- python面向对象编程 继承 组合 接口和抽象类
1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...
- python面向对象的继承-组合-02
*面向对象(OOP)的三大特征:**# 封装.继承.多态 继承 什么是继承 继承:# 是一种关系,描述两个对象之间什么是什么的什么的关系 例如:麦兜.佩奇.猪猪侠.猪刚鬣,都是猪 为什么要使用继承 继 ...
- python 面向对象之继承与派生
一:初识继承 1,什么是继承? 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类 ...
- python面向对象之继承/多态/封装
老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...
- python面向对象之继承与派生
一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的 ...
- 十七、Python面向对象之继承
在面向对象,继承是一个很重要的特性 子类与父类,子类是对父类的一种扩展,在父类的属性和方法上进行一些扩展 示例:没带继承 #定义一个带编号和状态的门的类 class Door(object): d ...
随机推荐
- python学习打卡 day07 set集合,深浅拷贝以及部分知识点补充
本节的主要内容: 基础数据类型补充 set集合 深浅拷贝 主要内容: 一.基础数据类型补充 字符串: li = ["李嘉诚", "麻花藤", "⻩海峰 ...
- C++使用thread类进行多线程编程
C++11中引入了一个用于多线程操作的thread类,简单多线程示例: #include <iostream> #include <thread> #include <W ...
- 【RFT】【环境配置】Mac
参考地址:http://blog.csdn.net/u010044052/article/details/70858015?utm_source=itdadao&utm_medium=refe ...
- BaseEditor
using UnityEngine;using System.Collections.Generic;using UnityEditor;using System.Text;using System. ...
- .NET 使用中文编码
在.Net Core中默认System.Text中不支持CodePagesEncodingProvider.Instance, System.Text.Encoding.CodePages.dll允许 ...
- JDK10 新特性
关于至此,我从大一下学习,以及大二上的巩固,这应该是SE部分的最后一章节内容,介绍一下jdk10的新特性 jdk在更新10之后,出现很多新特性,根据我所观看的视频,主要提及以下几点新特性 1.新增va ...
- Python3 函数注解
Python3提供一种语法,用于为函数声明中的参数和返回值附加元数据.下面的例子是注解后的版本,特点在第一行: 1 def clip(text : str, max_len : 'int > 0 ...
- python中enumerate内置库的使用
使用enumerate,可以自动进行索引下标的赋值,本例代码中使用enumerate,进行excel单元格的赋值操作. 代码如果重复被调用,可将该代码封装成类进行使用 1 import openpyx ...
- 学习笔记20—MATLAB特殊函数
1.qfunc就是Q函数 2.mae(平均绝对误差)函数,mae(abs(A-B)) 3.Z = zscore(x) 等价于 Z=(X-repmat(mean(X),57,1))./repmat(st ...
- CSS段落对齐方式
CSS段落对齐有两种方式:水平对齐和垂直对齐. 1.水平对齐: (1).text-align:left; //左对齐 (2).text-align:right; //右对齐 ...