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 相关文章推荐
python实现的二叉树算法和kmp算法实例
Apr 25 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
python opencv判断图像是否为空的实例
Jan 26 Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 Python
详解python 爬取12306验证码
May 10 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
Mar 09 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
Jul 13 Python
对python中list的五种查找方法说明
Jul 13 Python
Python基于staticmethod装饰器标示静态方法
Oct 17 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
Nov 09 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
PHP学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
2015/08/31 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
微信小程序 wx.request方法的异步封装实例详解
2017/05/18 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
跟老齐学Python之复习if语句
2014/10/02 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
python如何生成各种随机分布图
2018/08/27 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
Python调用C语言的实现
2019/07/26 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
Python xlrd excel文件操作代码实例
2020/03/10 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
DataList 能否分页,请问如何实现?
2015/05/03 面试题
mysql有关权限的表都有哪几个
2015/04/22 面试题
三年级数学教学反思
2014/01/31 职场文书
少先队中队工作总结
2015/08/14 职场文书
小学数学教师研修日志
2015/11/13 职场文书
Python中Numpy和Matplotlib的基本使用指南
2021/11/02 Python
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技