1. 第一个问题:

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

2. 第二个问题:

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

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

  代码:

class BaseClass:
num_Base_calls =
def call_me(self):
print("Calling method on BaseClass")
self.num_Base_calls += class LeftSubclass(BaseClass):
num_left_calls =
def call_me(self):
BaseClass.call_me(self)
print("Calling method on LeftSubclass")
self.num_left_calls += class RightSubclass(BaseClass):
num_Right_calls =
def call_me(self):
BaseClass.call_me(self)
print("Calling method on RightSubclass")
self.num_Right_calls += class Subclass(LeftSubclass,RightSubclass):
num_Sub_calls =
def call_me(self):
LeftSubclass.call_me(self)
RightSubclass.call_me(self)
print("Calling method on Subclass")
self.num_Sub_calls += s = Subclass()
s.call_me() # Calling method on BaseClass
# Calling method on LeftSubclass
# Calling method on BaseClass
# Calling method on RightSubclass
# Calling method on Subclass print(s.num_Sub_calls)
print(s.num_left_calls)
print(s.num_Right_calls)
print(s.num_Base_calls) #
#
#
#

  说明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()的方法去只查找一遍祖先类,代码如下:

class BaseClass:
num_Base_calls =
def call_me(self):
print("Calling method on BaseClass")
self.num_Base_calls += class LeftSubclass(BaseClass):
num_left_calls =
def call_me(self):
super().call_me()
print("Calling method on LeftSubclass")
self.num_left_calls += class RightSubclass(BaseClass):
num_Right_calls =
def call_me(self):
super().call_me()
print("Calling method on RightSubclass")
self.num_Right_calls += class Subclass(LeftSubclass,RightSubclass):
num_Sub_calls =
def call_me(self):
super().call_me()
print("Calling method on Subclass")
self.num_Sub_calls += s = Subclass()
s.call_me() # Calling method on BaseClass
# Calling method on RightSubclass
# Calling method on LeftSubclass
# Calling method on Subclass print(s.num_Sub_calls)
print(s.num_left_calls)
print(s.num_Right_calls)
print(s.num_Base_calls) #
#
#
#

  说明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. Linus Torvalds正式宣布Linux Kernel 5.1RC2 发布,相当正常

    导读 Linus Torvalds刚刚发布了Linux Kernel 5.2-rc2,这是继上周关闭合并窗口和随后的RC1之后的第一个内核测试版本. 在本周合并后的窗口活动中,Linus评论道,“嘿, ...

  2. yum相关变量浅析

    问题背景 同事发现一台centos7机器的yum repo不能使用,现象为相关的repo的meta文件下载失败,提示相关meta文件的下载路径有问题. 问题分析 通过终端输出的报错,发现是/etc/y ...

  3. jquery快速常用技能

    jQuery入口函数与js入口函数 (window.onload = function(){})的对比: 1.JavaScript的入口函数要等到页面中所有资源(包括图片.文件)加载完成才开始执行. ...

  4. 068-PHP定义并输出数组

    <?php $arr=array(98,'hello',67,'A',85,NULL); //定义一个数组 echo "输出第一个元素:{$arr[0]}"; //输出数组的 ...

  5. bool盲注中用到的截取字符串的函数(mid、substr、left)

    介绍一下常用的:mid.substr.left 1.mid()函数 此函数为截取字符串一部分.MID(column_name,start[,length]) 参数 描述 column_name 必需. ...

  6. 最简单的前端获取后台的json值(后台怎么返回一个json对象到前台)

    (说一下这个外部包jackson一般不用了,现在大家都用马云儿子的FastJson 下面服务器代码我就不改了大家随意用什么外部包)2019.1.14日改 我使用了外部包jackson(杰克逊哈哈哈啊) ...

  7. ELK 安装Elasticsearch

    章节 ELK 介绍 ELK 安装Elasticsearch ELK 安装Kibana ELK 安装Beat ELK 安装Logstash ELK栈要安装以下开源组件: Elasticsearch Ki ...

  8. linux命令之strace简单使用

    strace是什么 strace是一个可用于诊断.调试和教学的Linux用户空间跟踪器.我们用它来监控用户空间进程和内核的交互,比如系统调用.信号传递.进程状态变更等. 使用方式 strace 使用帮 ...

  9. 苏州大学ICPC集训队新生赛第二场

    A - Score UVA - 1585 水 #include<bits/stdc++.h> using namespace std; int main(){ int n; cin> ...

  10. 10 —— node —— 获取文件在前台遍历

    思想 : 前台主动发起获取 => ajax 1,前台文件 index.html <!DOCTYPE html> <html lang="en"> &l ...