学习笔记(Python继承)

有几种叫法(父类-子类、基类-派生类)
先拿代码演示一下:

 class father:
def work(self):
print("work>>>>>") def car(self):
print("car>>>>>>>>>") class son(father): #想要继承就得添加父类
def study(self):
print("study>>>>>>>>>>") obj = son()
obj.work() #在上面方法中,work中的self是形参,此时指向的是obj
#除此之外还很重要的是,self永远指向调用方法的调用者(比如这里指向obj)
#work>>>>>

由上述代码可以看出此时obj是调用子类的对象,但是却可以使用父类的方法,其主要原因是子类后添加了父类,如果没有加父类,则调用不了父类的方法从而报错,这种形式叫做继承
(self 永远指向调用方法的调用者)

1、当继承父类的方法时,如果不想调用父类的某些方法,则就需要自己在子类中重写

(下面类中重写父类中的work方法,先别去想太多限制)

 class son(father):
def study(self):
print("study>>>>>>>>>>") def work(self):
print("s.work") #不想继承就自己写(重写) #此时在调用方法时,先从子类的方法中查找,如果有该方法则调用,没有的话就去父类中调用
obj = son()
obj.work() #s.work

2、当继承父类方法时,自己子类重写了但是还是想要去执行父类被重写的方法,则进行下面操作:

 def work(self):
print("s.work")
super(son,self).work() #方一:调用super方法,super(当前类的名,self).父类被重写的方法())
father.work(self) #方二:这种方法是主动调用父类方法,此时的self需要我们主动添加,表示父类也要执行其对象方法

3、python和C++一样可以继承多个父类

 class uncle:
def video(self):
print("uncle.video")
class father(uncle):
def work(self):
print("father.work")
class mother:
def car(self):
print("mother.car") class son(father,mother):
def study(self):
print("son.study")

(1)多个父类继承是从左到右开始继承:

obj = son()
obj.car() # mother.car

(此时是先在father类中找car()方法,没有则再跳转到mother类中)

(2)如果继承的父类之上还有父类,则“一直寻找到底”,有则调用,无则继承下一个父类去找寻方法

obj = son()
obj.video() # uncle.video

(3)上面两种说法是基于其最终父类不是指向同一个,而现在的第三种判断则是基于最终父类是同一个的情况下而进行的讨论,代码如下:

class aunt:
def computer(self):
print("aunt.computer") class uncle:
def video(self):
print("uncle.video") class father(uncle):
def work(self):
print("father.work") class mother(aunt):
def car(self):
print("mother.car") class son(father, mother):
def study(self):
print("son.study") obj = son()
obj.computer() #aunt.computer

其执行的顺序如下图:

红线是往上继承,黑线是代码执行的流程
还是跟(1)(2)差不多,但是不一样的是,在左侧一直未找到所调用的方法时,并没有有一直找到底,而是在最后一个父类前回到son子类,开始在mother类中寻找,最后才指向aunt类并找到其computer()方法
((3)总结如果有共同父类,则在寻找方法时,不会一直寻到底,而是在寻到底之前的父类换到最原始给的父类中去寻找,如果都找不到才会找寻到底父类)怎么好理解就怎么去记忆

(4)self.方法()使用时代码执行的顺序

(下面代码修改了一些)

class uncle:
def video(self):
print("uncle.video")
class father(uncle):
def work(self):
print("father.work")
self.car()
def car(self):
print("father.car")
class mother:
def car(self):
print("mother.car") class son(mother,father):
def study(self):
print("son.study")
obj = son()
obj.work() #father.work
#mother.car

对象在去父类找寻方法时,由于mother类没有其方法,在father类下找到并执行后,方法内还有self.car(),按道理来说应该是同一类下有该方法就优先执行,但是结果却是mother.car,其原因很简单,当碰到self.方法()时,就应该返回到其对象(self所指向的对象,此代码是obj)所调用的类中再去执行其方法的调用(对于上述代码,就是再次调用obj.car(),然后先从方法的子类中寻找,再向其父类中找寻方法,第一个父类时mother,在mother类中有car()方法,所以就直接调用执行了,over!)

(5)类中的__init__()方法是在找寻到的第一个时去执行:

 class uncle:
def __init__(self):
print("uncle.init")
def video(self):
print("uncle.video")
class father(uncle):
def __init__(self):
print("father.init")
def work(self):
print("father.work")
class mother:
def car(self):
print("mother.car") class son(father,mother):
def study(self):
print("son.study")
obj = son() #father.init

(上述代码father类还继承了一个父类,它们同时有__init__方法,但是先遍历到子类father,所以就先调用其类下的init方法,每当执行其类的对象时,只会执行一次最先遇到的__init__的方法)

学习笔记——python(继承)的更多相关文章

  1. c++学习笔记之继承篇

    title: c++学习笔记之继承篇 date: 2017-03-26 16:36:33 tags: [c++,继承,public,virtual,private,protected] categor ...

  2. MongoDB学习笔记:Python 操作MongoDB

    MongoDB学习笔记:Python 操作MongoDB   Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...

  3. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  4. Python学习笔记--Python字符串连接方法总结

    声明: 这些总结的学习笔记,一部分是自己在工作学习中总结,一部分是收集网络中的知识点总结而成的,但不到原文链接.如果有侵权,请知会,多谢. python中有很多字符串连接方式,总结一下: 1)最原始的 ...

  5. 集智人工智能学习笔记Python#0

    1,学习基本Python语句规范: print('Hello world') print() 为函数 ‘Hello world’为字符串 2,表达式和语句的区别: 表达式有结果,运算就是表达式的一种: ...

  6. python基础学习笔记—— 多继承

    本节主要内容: 1.python多继承 2.python经典类的MRO 3.python新式类的MRO.C3算法 4.super是什么鬼? 一.python多继承 在前⾯的学习过程中. 我们已经知道了 ...

  7. python基础学习笔记——单继承

    1.为什么要有类的继承性?(继承性的好处)继承性的好处:①减少了代码的冗余,提供了代码的复用性②提高了程序的扩展性 ③(类与类之间产生了联系)为多态的使用提供了前提2.类继承性的格式:单继承和多继承# ...

  8. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  9. python学习笔记-python解释器

    刚开始学习python,首先要了解一下python解释器. 什么是python解释器? 编写python代码保存后,我们会得到一个以.py为扩展名的文本文件.要运行此文件,就需要python解释器去执 ...

随机推荐

  1. set集合迭代

    1.迭代遍历 Set<String> set = new HashSet<String>(); Iterator<String> it = set.iterator ...

  2. doT 这个模板 是怎么实现的?(1)

  3. 创建过滤扩展方法 Creating Filtering Extension Methods 精通ASP-NET-MVC-5-弗瑞曼 Listing 4-17

  4. Ubuntu16手动安装OpenStack——nova篇。。转

    前言: 本文转自https://www.voidking.com/dev-ubuntu16-manual-openstack-nova/ ,过程非常的详细,作者也说本实验最终失败,因为课程要求我们只要 ...

  5. 通过识别页面内容获得返回值判断后续执行(exists指令的用法)

    本案例主要用到airtest 的exists指令 从指令解释可以知道,当判断某图片不存在的时候,会返回false值 脚本思路即为如果返回值==false则执行A,!=fales则执行B 下图脚本思路, ...

  6. [HAOI2015]树上操作(树链剖分)

    [HAOI2015]树上操作(luogu) Description 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增 ...

  7. C语言系列之预处理指令、循环左移函数的使用(四)

    本章节将讲两个知识点 第一个知识点:常用的预处理指令 第二个知识点:循环左移右移函数 第一个知识点:预处理指令 一种预处理指令是#define,他把名字A定义为P0,当这个名字出现在源文件的任何地方时 ...

  8. jdk和dubbo的SPI机制

    前言:开闭原则一直是软件开发领域中所追求的,开闭原则中的"开"是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的,“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代 ...

  9. 【大白话系列】MySQL 学习总结 之 初步了解 InnoDB 存储引擎的架构设计

    一.存储引擎 上节我们最后说到,SQL 的执行计划是执行器组件调用存储引擎的接口来完成的. 那我们可以理解为:MySQL 这个数据库管理系统是依靠存储引擎与存放数据的磁盘文件进行交互的. 那么 MyS ...

  10. Tarjan算法——强连通、双连通、割点、桥

    Tarjan算法 概念区分 有向图 强连通:在有向图\(G\)中,如果两个顶点\(u, v\ (u \neq v)\)间有一条从\(u\)到\(v\)的有向路径,同时还有一条从\(v\)到\(u\)的 ...