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. c#实现"扫描检测硬件改动"

    public static class Win32Api { public const int CM_LOCATE_DEVNODE_NORMAL = 0x00000000; public const ...

  2. php.laravel.部署

    Laravel 的部署 D  参考laravel-china的做 | 其他参考 | 重要的参考 | Nginx github | 如果想要ssl 啊

  3. 开源DDD设计模式框架YMNNetCoreFrameWork第二篇-增加swagger,数据库迁移,增加权限模型

    1.框架去掉application层,把HOst作为application层 2.增加swagger插件 3.增加Asp.net  Identity身份验证 源代码地址:https://github. ...

  4. 女神说不能每张照片P的一样,所以朋友圈开三天可见,用Python一步解决

    大家好,我是小三十三,一个刚恰完午饭,正在用刷网页浪费生命的蒟蒻... 一堆堆无聊八卦信息的网页内容慢慢使我的双眼模糊,一个哈欠打出了三斤老泪,就在此时我看到了一张图片: ! 是谁!是谁把我女朋友的照 ...

  5. jar包学习

    jar: java的压缩包,主要用于存储类文件,或者配置文件等. 命令格式: jar -cf 包名.jar 包目录 解压缩: jar -xvf 包名.jar 将jar包目录列表重定向到一个文件中: j ...

  6. C#图片闪烁

    导致画面闪烁的关键原因分析:       一.绘制窗口由于大小位置状态改变进行重绘操作时      绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗 ...

  7. Spark 资源调度包 stage 类解析

    spark 资源调度包 Stage(阶段) 类解析 Stage 概念 Spark 任务会根据 RDD 之间的依赖关系, 形成一个DAG有向无环图, DAG会被提交给DAGScheduler, DAGS ...

  8. JSP标签 <fmt:formatDate>格式化日期

    <fmt:formatDate>标签用于使用不同的方式格式化日期. <%@ page language="java" contentType="text ...

  9. java虚拟机之JVM体系结构

    JVM体系结构: 下面重点介绍运行时数据区域模块: (1)java堆(Heap) 被所有线程共享的一块内存区域,在虚拟机启动时创建 用来存储对象实例 可以通过-Xmx和-Xms控制堆的大小 OutOf ...

  10. COGS1487 麻球繁衍

    不会做%%http://blog.csdn.net/doom_bringer/article/details/50428503 #include<bits/stdc++.h> #defin ...