Python说文解字_父类的继承

1. 第一个问题:

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

2. 第二个问题:

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

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

  代码:

class BaseClass:
    num_Base_calls = 0
    def call_me(self):
        print("Calling method on BaseClass")
        self.num_Base_calls += 1

class LeftSubclass(BaseClass):
    num_left_calls = 0
    def call_me(self):
        BaseClass.call_me(self)
        print("Calling method on LeftSubclass")
        self.num_left_calls += 1

class RightSubclass(BaseClass):
    num_Right_calls = 0
    def call_me(self):
        BaseClass.call_me(self)
        print("Calling method on RightSubclass")
        self.num_Right_calls += 1

class Subclass(LeftSubclass,RightSubclass):
    num_Sub_calls = 0
    def call_me(self):
        LeftSubclass.call_me(self)
        RightSubclass.call_me(self)
        print("Calling method on Subclass")
        self.num_Sub_calls += 1

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
# 1
# 1
# 2

  说明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 = 0
    def call_me(self):
        print("Calling method on BaseClass")
        self.num_Base_calls += 1

class LeftSubclass(BaseClass):
    num_left_calls = 0
    def call_me(self):
        super().call_me()
        print("Calling method on LeftSubclass")
        self.num_left_calls += 1

class RightSubclass(BaseClass):
    num_Right_calls = 0
    def call_me(self):
        super().call_me()
        print("Calling method on RightSubclass")
        self.num_Right_calls += 1

class Subclass(LeftSubclass,RightSubclass):
    num_Sub_calls = 0
    def call_me(self):
        super().call_me()
        print("Calling method on Subclass")
        self.num_Sub_calls += 1

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
# 1
# 1
# 1

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

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

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

3. 总结:

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

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

  

原文地址:https://www.cnblogs.com/noah0532/p/10958282.html

时间: 2024-11-07 23:10:00

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

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

1. 先看一段属性继承的代码: class User: def __init__(self,name,age): self.name = name self.age = age class User1(User): def __init__(self,name,age,height,weight): self.height = height self.weight = weight # 此处像继承父类的name 和 age super().__init__(name, age) user1 =

Python说文解字_杂谈05

1. isinstance和type: is和==符号,is指的是内存地址,是不是一个对象,ID知否相同 集成链 class A: pass class B(A): pass b = B() print(isinstance(b,B)) print(isinstance(b,A)) print(type(b) is B) print(id(type(b)),id(B)) # 2943616512536 2943616512536 2. 类变量和对象变量: 类中的self == 实例,其实就等于a

Python说文解字_杂谈08

1. Python变量到底是什么? Python和Java中的变量本质不一样,python的变量实质是一个指针 int str,便利贴 a = 1 # 1. a贴在1上面 # 2. 它的过程是先生成对象,然后贴便利贴. # 3. is 是指的标签贴是否一样. a = 1 b = 1 这个是一样,用的是小整数的内部inter机制的内部优化. == 用的是__eq__这个魔法函数. # 4. 常用的用法是isinstance或者type() is,这两种是通用的.type实际上是指向了这个对象的.

Python说文解字_杂谈06

1. 序列类型的分类: 容器类型:list.tuple,deque 扁平序列:str.bytes.bytearray.array.array 可变序列:list.dequte.bytearray.array 不可变序列:str.tuple.bytes 2. 序列的abc继承关系: 魔法函数构成了协议 3.序列的+ +=和extend的区别: my_list = [] my_list.append(1) my_list.append("a") from collections impor

Python说文解字_Python之多任务_01

Python 之 多任务: Python之多任务是现在多任务编程运用Python语言为载体的一种体现.其中涵盖:进程.线程.并发等方面的内容,以及包括近些年在大数据运算.人工智能领域运用强大的GPU运算能力实现的各种算法.属于Python语言中比较高级的应用形式.文章采取问答的形式对知识点和相关应用的模式进行详解,看似像意识流形态的文章,其内容也是遵循循序渐进,力求全面和精细. 问:什么是多任务? 答:百度定义:“当多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务.

嘻嘻哈哈说文解字(讲)

讲的左边是言,右边是井,我想,老祖宗造这个字的意思应该是:话是应该说,但不能说多,不能井边说,言空了就掉井里了(所谓言虚容易掉到井里面).但奈何我们的记忆总不好,只记住了左边的言,这不,你看我们天天都在讲道德,讲道理,讲公德,讲廉洁,讲大公无私....... 上层一边讲一边注水,中层一边讲一边捞钱,下层,边讲边能搞点啥算点啥. 精英一边讲爱国一边移民,大众一边讲爱国一边拆墙脚 ...... 我说这些绝不是说我们没有素质,没有道德,没有理想的.我们都是好人,确确实实的正派好人,这一切主要坏就坏在这

说文解字

1."五色土"中中央之土是什么颜色? 黄色 2."床前明月光"的"床"类似于今天的哪种家具?   茶几 3.小篆"思"字上半部分念什么?xìn 4.<千字文>集的哪位书法家的字?王羲之 5.<千字文>的作者是谁?周兴嗣 6.以下书籍中,哪些属于蒙学读物"三百千千"?<千字文><百家姓> 7.<千字文>撰成于梁代吗?√ 8.据顾炎武<日知录&g

说文解字----矩阵分析(二)特征值特征向量 奇异值分解(SVD)

特征值,奇异值,相关分解是矩阵分析中一个非常重要的概念,我再网上找了些资料,很多人已经对此分析的非常纯熟,为了尊重原创作者,首先贴几个链接,大家欣赏下: 外文链接:http://www.ams.org/samplings/feature-column/fcarc-svd 翻译文章:http://blog.csdn.net/dinosoft/article/details/37884597 数学之美与SVDhttp://blog.chinaunix.net/uid-24517893-id-3261

说文解字——傅里叶变换、拉普拉斯变换、Z变换 (上)

在开始了解这些变换之前,简单复习一下级数的概念: 级数的概念之所以重要,是因为我们现实生活中经常遇到一些不规则的函数,为了方便我们的研究,我们希望能有一种方法来用简单的多项式或者多个函数来近似表示这个函数,这就是我们研究级数的原因:任意一个函数都能用多项式逼近: 假定我们有一个函数f(x),他的曲线是不规则的,我们很难去探索这种曲线的性质,但是如果我们把这种曲线展开成f(x)=f(x0)+f′(x0)(x?x0)+.........,展开式中的函数式我们熟悉的,这样会更便于我们的分析.如果这个例