学习笔记(Python继承)

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

  1. class father:
  2. def work(self):
  3. print("work>>>>>")
  4.  
  5. def car(self):
  6. print("car>>>>>>>>>")
  7.  
  8. class son(father): #想要继承就得添加父类
  9. def study(self):
  10. print("study>>>>>>>>>>")
  11.  
  12. obj = son()
  13. obj.work() #在上面方法中,work中的self是形参,此时指向的是obj
  14. #除此之外还很重要的是,self永远指向调用方法的调用者(比如这里指向obj)
  15. #work>>>>>

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

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

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

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

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

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

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

  1. class uncle:
  2. def video(self):
  3. print("uncle.video")
  4. class father(uncle):
  5. def work(self):
  6. print("father.work")
  7. class mother:
  8. def car(self):
  9. print("mother.car")
  10.  
  11. class son(father,mother):
  12. def study(self):
  13. print("son.study")

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

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

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

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

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

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

  1. class aunt:
  2. def computer(self):
  3. print("aunt.computer")
  4.  
  5. class uncle:
  6. def video(self):
  7. print("uncle.video")
  8.  
  9. class father(uncle):
  10. def work(self):
  11. print("father.work")
  12.  
  13. class mother(aunt):
  14. def car(self):
  15. print("mother.car")
  16.  
  17. class son(father, mother):
  18. def study(self):
  19. print("son.study")
  20.  
  21. obj = son()
  22. obj.computer() #aunt.computer

其执行的顺序如下图:

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

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

(下面代码修改了一些)

  1. class uncle:
  2. def video(self):
  3. print("uncle.video")
  4. class father(uncle):
  5. def work(self):
  6. print("father.work")
  7. self.car()
  8. def car(self):
  9. print("father.car")
  10. class mother:
  11. def car(self):
  12. print("mother.car")
  13.  
  14. class son(mother,father):
  15. def study(self):
  16. print("son.study")
  17. obj = son()
  18. obj.work() #father.work
  19. #mother.car

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

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

  1. class uncle:
  2. def __init__(self):
  3. print("uncle.init")
  4. def video(self):
  5. print("uncle.video")
  6. class father(uncle):
  7. def __init__(self):
  8. print("father.init")
  9. def work(self):
  10. print("father.work")
  11. class mother:
  12. def car(self):
  13. print("mother.car")
  14.  
  15. class son(fathermother):
  16. def study(self):
  17. print("son.study")
  18. 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. [bzoj4446] [loj#2009] [Scoi2015] 小凸玩密室

    Description 小凸和小方相约玩密室逃脱,这个密室是一棵有 \(n\) 个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯泡即可逃出密室.每个灯泡有个权值 \(Ai\) ,每条边也有个权值 \ ...

  2. [bzoj4444] [loj#2007] [洛谷P4155] [Scoi2015] 国旗计划

    Description \(A\) 国正在开展一项伟大的计划--国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了 ...

  3. Windows环境下配置robotframework

    Robot Framework安装准备 一.python3.6以上版本 安装过程中勾选“add python to path”,就可以自动配置好环境变量. 安装完成后在命令行输入python,如下图所 ...

  4. Algorithm: 多项式乘法 Polynomial Multiplication: 快速傅里叶变换 FFT / 快速数论变换 NTT

    Intro: 本篇博客将会从朴素乘法讲起,经过分治乘法,到达FFT和NTT 旨在能够让读者(也让自己)充分理解其思想 模板题入口:洛谷 P3803 [模板]多项式乘法(FFT) 朴素乘法 约定:两个多 ...

  5. laravel自动生成model

    laravel自动生成model 添加PHP扩展 composer require krlove/eloquent-model-generator --dev config/app注册Generato ...

  6. layui数据表格及分页

    一.前端部分 html只需要放一个有id的div就行了,方便js获取渲染区域 <div id="data_grid" lay-filter="demo" ...

  7. java基础算法(一):最大子序列和问题的多种算法思路

    问题: /** * 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和,并顺序打印子序列. * 示例: * 输入: [-2,1,-3,4,-1,2,1 ...

  8. JQuery--使用JQuery 的$.ajax 方法进行异步请求,导致页面闪烁

    情景 目前有个需求是在文本框填入内容,自动触发keyup事件,下拉列表会自动过滤相应的选项,但是使用了$,ajax后发现,每次触发事件时,都导致整个网页闪烁,触发了全局ajax事件 代码片段 $.aj ...

  9. OpenCV3入门(四)图像的基础操作

    1.访问图像像素 1)灰度图像 2)彩色图像 OpenCV中的颜色顺序是BGR而不是RGB. 访问图像的像素在OpenCV中就是访问Mat矩阵,常用的有三种方法. at定位符访问 Mat数据结构,操作 ...

  10. HDU3836 Equivalent Sets (Tarjan缩点+贪心)

    题意: 给你一张有向图,问你最少加多少条边这张图强连通 思路: 缩点之后,如果不为1个点,答案为出度为0与入度为0的点的数量的最大值 代码: #include<iostream> #inc ...