1. 第一个问题:

  我们知道类是可以继承其他类的,在继承的过程中我们不光可以继承父类的方法,还可继承父类的属性,另外还可以在父类的基础上添加自己的东西。

2. 第二个问题:

  我们继承父类属性和方法的时候无需再把父类的属性和方法再写一般。通常用的方法是:父类名.方法/属性,另外还有一种方式就是super().的方法。但其实这两种方式是有一些不同的。

  首先举例第一种方式:父类名.方法/属性。

  代码:

  1. class BaseClass:
  2. num_Base_calls =
  3. def call_me(self):
  4. print("Calling method on BaseClass")
  5. self.num_Base_calls +=
  6.  
  7. class LeftSubclass(BaseClass):
  8. num_left_calls =
  9. def call_me(self):
  10. BaseClass.call_me(self)
  11. print("Calling method on LeftSubclass")
  12. self.num_left_calls +=
  13.  
  14. class RightSubclass(BaseClass):
  15. num_Right_calls =
  16. def call_me(self):
  17. BaseClass.call_me(self)
  18. print("Calling method on RightSubclass")
  19. self.num_Right_calls +=
  20.  
  21. class Subclass(LeftSubclass,RightSubclass):
  22. num_Sub_calls =
  23. def call_me(self):
  24. LeftSubclass.call_me(self)
  25. RightSubclass.call_me(self)
  26. print("Calling method on Subclass")
  27. self.num_Sub_calls +=
  28.  
  29. s = Subclass()
  30. s.call_me()
  31.  
  32. # Calling method on BaseClass
  33. # Calling method on LeftSubclass
  34. # Calling method on BaseClass
  35. # Calling method on RightSubclass
  36. # Calling method on Subclass
  37.  
  38. print(s.num_Sub_calls)
  39. print(s.num_left_calls)
  40. print(s.num_Right_calls)
  41. print(s.num_Base_calls)
  42.  
  43. #
  44. #
  45. #
  46. #

  说明1:有这么一个基类叫做Baseclass,继承给Leftclass和Rightclass,然后Leftclass和Rightclass分别继承给Subclass。就是这么一个简单的关系。

  说明2:问题是,在最后的Subclass被执行的时候,我们发现最基础的基类中的Call_me方法被执行了2次?

  说明3:关于多继承需要记住的是,我们只想调用类层级的下一个方法,而不是“父类”方法。实际上,下一个方法可能不属于该类的父类或者更早的祖先。

  说明4. 说的更明白一点就是这种模式是如图所示:

  subclass -- 寻找--Leftclass--寻找--Baseclass:第一遍:打印Baseclass和Leftclass

  subclass -- 寻找 -- Rightclass -- 寻找 -- Baseclass:第二遍:打印:Baseclass和Rightclass

  subclass -- 自己-- 打印 subclass

  说明5:其实我们在实际的过程中,继承到最后,我们只想寻找一遍父类的父类(最初的祖先类),用这种方式是不行的。因此我们引入了super()这个函数来阻断只查找一次。

  

  其次:我们用super()的方法去只查找一遍祖先类,代码如下:

  1. class BaseClass:
  2. num_Base_calls =
  3. def call_me(self):
  4. print("Calling method on BaseClass")
  5. self.num_Base_calls +=
  6.  
  7. class LeftSubclass(BaseClass):
  8. num_left_calls =
  9. def call_me(self):
  10. super().call_me()
  11. print("Calling method on LeftSubclass")
  12. self.num_left_calls +=
  13.  
  14. class RightSubclass(BaseClass):
  15. num_Right_calls =
  16. def call_me(self):
  17. super().call_me()
  18. print("Calling method on RightSubclass")
  19. self.num_Right_calls +=
  20.  
  21. class Subclass(LeftSubclass,RightSubclass):
  22. num_Sub_calls =
  23. def call_me(self):
  24. super().call_me()
  25. print("Calling method on Subclass")
  26. self.num_Sub_calls +=
  27.  
  28. s = Subclass()
  29. s.call_me()
  30.  
  31. # Calling method on BaseClass
  32. # Calling method on RightSubclass
  33. # Calling method on LeftSubclass
  34. # Calling method on Subclass
  35.  
  36. print(s.num_Sub_calls)
  37. print(s.num_left_calls)
  38. print(s.num_Right_calls)
  39. print(s.num_Base_calls)
  40.  
  41. #
  42. #
  43. #
  44. #

  说明1:我们在每一个子类的每一个类中加入了super()这种方式就解决了这个问题。

  说明2:这样查找顺序就变成了如下:

  subclass -- 查找 -- leftclass 和 rightclass -- 包含 -- Baseclass:打印:basecalss,right subclass,leftclass,subclass

3. 总结:

  使用第一种方法就是用二分通路的方式,走一遍,循环回来再走一遍。

  使用第二种方法就是用包含的方式,像剥洋葱一样,一层一层的剥开,相似的不再保留。

  

Python说文解字_父类的继承的更多相关文章

  1. Python说文解字_杂谈05

    1. isinstance和type: is和==符号,is指的是内存地址,是不是一个对象,ID知否相同 集成链 class A: pass class B(A): pass b = B() prin ...

  2. Python说文解字_详解元类

    1.深入理解一切接对象: 1.1 什么是类和对象? 首先明白元类之前要明白什么叫做类.类是面向对象object oriented programming的重要概念.在面向对象中类和对象是最基本的两个概 ...

  3. Python说文解字_杂谈09

    1. 元类编程代码分析: import numbers class Field: pass class IntField(Field): # 数据描述符: # 初始化 def __init__(sel ...

  4. Python说文解字_杂谈08

    1. Python变量到底是什么? Python和Java中的变量本质不一样,python的变量实质是一个指针 int str,便利贴 a = 1 # 1. a贴在1上面 # 2. 它的过程是先生成对 ...

  5. Python说文解字_杂谈07

    1. 深入dict from collections.abc import Mapping,MutableMapping # dict 属于mapping类型 a = {} print(isinsta ...

  6. Python说文解字_杂谈01

    1. Python在Ubuntu下面下载Python 2. 安装依赖包 sudo apt-get update sudo apt-get install build-essential python- ...

  7. Python说文解字_半成品再加工

    1. 其实在编写代码的时候,根据需求和程序员的喜好,对现有类中的属性和方法进行二次加工,原先所给与的属性和方法贴合自己想要的需求.这就是我们常说的“重写”和二次封装. 2. 比如我们对现有的库list ...

  8. Python说文解字_继承过程中的参数集合

    1. 先看一段属性继承的代码: class User: def __init__(self,name,age): self.name = name self.age = age class User1 ...

  9. Python说文解字_杂谈06

    1. 序列类型的分类: 容器类型:list.tuple,deque 扁平序列:str.bytes.bytearray.array.array 可变序列:list.dequte.bytearray.ar ...

随机推荐

  1. c#查看本机网络端口和对应的程序名

    360安全卫士里面有个组件叫流量防火墙,感觉挺好用,但是不想安装360全家桶,于是自己捣鼓着用C#写一个比较简化的版本. 查看电脑上开启的TCP或UDP端口,可以用netstat命令,netstat用 ...

  2. 死循环(endless loop)

    死循环 死循环就是一个无法结束的循环.(endless loop / infinite loop) 出现死循环是因为没有设置好结束条件,循环的结束条件很重要,要充分考虑各种边界情况. 以上一篇随笔中的 ...

  3. 二十三、SAP中内表的修改

    一.通过MODIFY关键字来修改内表的内容,it相当于全部内容,wa相当于一条内容 二.效果如下

  4. ICE使用记录

    在使用ice中间件的过程中 如果A继承了 ****Disp_类 在使用A类的时候 ****Disp_类会浅表克隆该类出一个新的对象a 在调用重写的接口的时候是使用a 在主动调用A类的对象的时候使用的才 ...

  5. 通过 spark.files 传入spark任务依赖的文件源码分析

    版本:spak2.3 相关源码:org.apache.spark.SparkContext 在创建spark任务时候,往往会指定一些依赖文件,通常我们可以在spark-submit脚本使用--file ...

  6. 六、React 键盘事件 表单事件 事件对象以及React中的ref获取dom节点 、React实现类似Vue的双向数据绑定

    接:https://www.cnblogs.com/chenxi188/p/11782349.html 事件对象 .键盘事件. 表单事件 .ref获取dom节点.React实现类似vue双向数据绑定 ...

  7. kubernter相关内容

    1. Kubernetes 第一章:互联网架构的演变 随着1946年世界上第一台电子计算机的问世网络就随之出现了,只不过当初只是为了解决多个终端之间的连接,这就是局域网的雏形.后来,随着美国国防部高级 ...

  8. java的形参与实参的区别以及java的方法

    package com.lv.study; public class Demo05 { public static void main(String[] args) { //我想要用什么分隔符进行分隔 ...

  9. SpringBoot的Banner横幅

    SpringBoot的Banner横幅即在SpringBoot应用程序启动过程中,日志输出的如下内容: 如果想替换此部分内容的话,可以在classpath根路径下建立一个文件,命名为:banner.t ...

  10. 2016蓝桥杯省赛C/C++A组第二题 跳蚱蜢

    题意:有9只盘子,排成1个圆圈.  其中8只盘子内装着8只蚱蜢,有一个是空盘. 我们把这些蚱蜢顺时针编号为 1~8 每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中.  请 ...