Python super()方法原理详解


Posted in Python onMarch 31, 2020

在学习 Python 类的时候,会碰见类中有 __init__() 这样一个函数,其实它就是 Python 的构造方法。

构造方法类似于类似 init() 这种初始化方法,来初始化新创建对象的状态,在一个对象创建后会立即调用,比如像实例化一个类:

f = FooBar()
f.init()#手动初始化

使用构造方法就能让它简化成如下形式:对象创建后自动调用魔法方法__init__(),对对象进行初始化操作

f = FooBar()

在明白了构造方法之后,来点进阶的问题,那就是父类的构造方法中的初始值无法继承的问题。

class Bird:
  def __init__(self):
     self.hungry = True
  def eat(self):
     if self.hungry:
        print 'Ahahahah'
     else:
        print 'No thanks!'

class SongBird(Bird):
   def __init__(self):
     self.sound = 'Squawk'
   def sing(self):
     print self.song()

sb = SongBird()
sb.sing()  # 能正常输出
sb.eat()   # 报错,因为 songgird 中没有 hungry 特性

解决这个问题的办法有两种:

1、调用未绑定的超类构造方法(不推荐)

class SongBird(Bird):
   def __init__(self):
     Bird.__init__(self) #
     self.sound = 'Squawk'
   def sing(self):
     print self.song()

原理:在调用了一个实例的方法时,该方法的self参数会自动绑定到实例上(称为绑定方法);如果直接调用类的方法(比如Bird.__init__),那么就没有实例会被绑定,可以自由提供需要的self参数(未绑定方法)。

2、使用super函数(推荐)

class SongBird(Bird):
   def __init__(self):
     super(SongBird,self).__init__()
     self.sound = 'Squawk'
   def sing(self):
     print self.song()

原理:它会查找所有的超类,以及超类的超类,直到找到所需的特性为止。

super() 函数是用于调用父类(超类)的一个方法。

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重

复调用(钻石继承)等种种问题。

MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。(菜鸟文档)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
精确查找PHP WEBSHELL木马的方法(1)
Apr 12 Python
python使用pil生成缩略图的方法
Mar 26 Python
在Django中限制已登录用户的访问的方法
Jul 23 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
Python中 map()函数的用法详解
Jul 10 Python
Python用5行代码写一个自定义简单二维码
Oct 21 Python
Python适配器模式代码实现解析
Aug 02 Python
PyQt5多线程刷新界面防假死示例
Dec 13 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
python 画图 图例自由定义方式
Apr 17 Python
通过cmd进入python的步骤
Jun 16 Python
带你学习Python如何实现回归树模型
Jul 16 Python
django实现更改数据库某个字段以及字段段内数据
Mar 31 #Python
django rest framework serializer返回时间自动格式化方法
Mar 31 #Python
Python @property及getter setter原理详解
Mar 31 #Python
关于Django Models CharField 参数说明
Mar 31 #Python
Django Serializer HiddenField隐藏字段实例
Mar 31 #Python
Django-xadmin+rule对象级权限的实现方式
Mar 30 #Python
Python3 hashlib密码散列算法原理详解
Mar 30 #Python
You might like
乐信RP2100的电路分析和打磨
2021/03/02 无线电
PHP4实际应用经验篇(5)
2006/10/09 PHP
PHP 第二节 数据类型之数值型
2012/04/28 PHP
codeigniter教程之多文件上传使用示例
2014/02/11 PHP
PHP中ini_set和ini_get函数的用法小结
2014/02/18 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
php json相关函数用法示例
2017/03/28 PHP
php自定义函数实现统计中文字符串长度的方法小结
2017/04/15 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
2015/12/28 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
Vue组件的使用教程详解
2018/01/05 Javascript
详解JS中统计函数执行次数与执行时间
2018/09/04 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
vue的webcamjs集成方式
2020/11/16 Javascript
python写的一个squid访问日志分析的小程序
2014/09/17 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
python3 读写文件换行符的方法
2018/04/09 Python
Pyqt QImage 与 np array 转换方法
2019/06/27 Python
对DJango视图(views)和模版(templates)的使用详解
2019/07/17 Python
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
求职推荐信
2013/10/28 职场文书
七一党建活动方案
2014/01/28 职场文书
七一建党日演讲稿
2014/09/05 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
社区综治工作汇报
2014/10/27 职场文书
纪念建国70周年演讲稿
2019/07/19 职场文书
如何自己动手写SQL执行引擎
2021/06/02 MySQL
python套接字socket通信
2022/04/01 Python