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

 更新时间:2017年01月15日 19:47:06   作者:hongweipeng  
最近在工作中实现父类调用的时候发现了一个错误,然后通过分析实践总结出来了,下面这篇文章主要给大家总结了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小进度条显示代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Python统计某列不同值的个数的示例代码

    Python统计某列不同值的个数的示例代码

    在数据分析和数据处理中,统计数据往往集中在特定列中不同值的出现次数,本文主要介绍了Python统计某列不同值的个数的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • python Prophet时间序列预测工具库使用功能探索

    python Prophet时间序列预测工具库使用功能探索

    Python Prophet是一个强大的时间序列预测工具,由Facebook开发,具有易用性和高度可定制性的特点,本文将深入介绍Python Prophet的基本概念、安装方法以及如何使用它进行时间序列预测,并提供丰富的示例代码来帮助大家入门
    2024-01-01
  • Python使用sys.exc_info()方法获取异常信息

    Python使用sys.exc_info()方法获取异常信息

    这篇文章主要介绍了Python使用sys.exc_info()方法获取异常信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Python实现Linux监控的方法

    Python实现Linux监控的方法

    本文通过实例代码给大家介绍了Python实现Linux监控的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • python 实现银行卡号查询银行名称和简称功能

    python 实现银行卡号查询银行名称和简称功能

    这篇文章主要介绍了python 实现银行卡号查询银行名称和简称功能,本文通过实例代码补充介绍了基于PyQT5+OpenCv实现银行卡号识别功能,感兴趣的朋友一起看看吧
    2023-11-11
  • python中turtle库的简单使用教程

    python中turtle库的简单使用教程

    这篇文章主要给大家介绍了关于python中turtle库的简单使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Python协程 yield与协程greenlet简单用法示例

    Python协程 yield与协程greenlet简单用法示例

    这篇文章主要介绍了Python协程 yield与协程greenlet简单用法,简要讲述了协程的概念、原理,并结合实例形式分析了Python协程 yield与协程greenlet基本使用方法,需要的朋友可以参考下
    2019-11-11
  • python简单几步实现时间日期处理到数据文件的读写

    python简单几步实现时间日期处理到数据文件的读写

    这篇文章主要为大家介绍了python简单几步实现时间日期处理到数据文件的读写详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 详解Python中__new__方法的作用

    详解Python中__new__方法的作用

    Python类中有些方法名、属性名的前后都添加__双下画线,这种方法、属性通常属于Python的特殊方法和特殊属性。本文将聊聊构造方法__new__实际程序的应用场景,感兴趣的可以了解一下
    2022-03-03

最新评论