总结python实现父类调用两种方法的不同

yipeiwu_com5年前Python基础

python中有两种方法可以调用父类的方法:

super(Child, self).method(args)

 Parent.method(self, args)

我用其中的一种报了如下错误:

找不到 classobj。当我把调用改为 super(B, self).f(name) 就能正确运行,且结果正确。

分析错误

因为基类没有继承 object , 在python中,一个可以这样创建:

class A:
 pass

也可以这样创建:

class A(object):
 pass

这两者的区别就是:

这是老式类(前者)和新式类(后者)的区别。区别可以参考:https://docs.python.org/release/2.5.2/ref/node33.html

python3已经把旧类型去掉了,也就是说已经隐式继承了object,所以,python3中写不写继承object都是没有区别的

两种调用的区别

Parent.__init__(self) super(Child, self).__init__() 的区别是什么?

super 理解成父类也是理所当然,python里其实指的是 MRO 中的下一个类!

super其实干了这件事,看这个答案:

def super(cls, inst):
 mro = inst.__class__.mro() # Always the most derived class
 return mro[mro.index(cls) + 1]

MRO 全称 Method Resolution Order,它代表了类继承的顺序。

super 是用来解决多重继承问题的,假设B C D 都是直接继承class A

class E(B, C, D):
 def __init__(self):
  # code...

如果E类的构造函数使用 super(E, self).__init__() 时,A类的构造函数会被执行一次,而用另一种方法,A类的构造函数会被执行多次。

在 MRO 中,基类永远出现在派生类后面,如果有多个基类,基类的相对顺序保持不变。

总结

个人觉得,复杂的继承结构是设计中不良的设计,当继承结构清晰后,两个方法其实就没什么区别了。以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助。

相关文章

微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧

微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧

前言   小程序跳一跳最近很火,之前爆出微信游戏小程序漏洞,网上也不乏大神。这里就用一大神的python脚本来刷下高分。 跳一跳python脚本传送门 配置过程 注: 电脑环境未配置...

Python中的延迟绑定原理详解

直接看下面例子 my_ld = [lambda x:x*i for i in range(3)] my_list = [ld(2) for ld in my_ld] print(my...

python 读取文件并把矩阵转成numpy的两种方法

在当前目录下: 方法1: file = open(‘filename') a =file.read() b =a.split(‘\n')#使用换行 len(b) #统计有多少行...

Python函数的定义方式与函数参数问题实例分析

Python函数的定义方式与函数参数问题实例分析

本文实例讲述了Python函数的定义方式与函数参数问题。分享给大家供大家参考,具体如下: 涉及内容: 函数的定义方式 函数的文字描述 空操作语句 位置参数 默认参...

python 内置函数filter

python 内置函数filter class filter(object): """ filter(function or None, iterable) --> fil...