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程序抓取网页的HTML信息的一个小实例
May 02 Python
python实现的简单抽奖系统实例
May 22 Python
Python3使用正则表达式爬取内涵段子示例
Apr 22 Python
利用python对Excel中的特定数据提取并写入新表的方法
Jun 14 Python
使用11行Python代码盗取了室友的U盘内容
Oct 23 Python
python如何爬取网站数据并进行数据可视化
Jul 08 Python
解决Django后台ManyToManyField显示成Object的问题
Aug 09 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
Apr 02 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 Python
Python之字符串的遍历的4种方式
Dec 08 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
Feb 16 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 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.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
php中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
PHP学习记录之数组函数
2018/06/01 PHP
Javascript String.replace的妙用
2009/09/08 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
防止浏览器记住用户名及密码的简单实用方法
2013/04/22 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
微信小程序 template模板详解及实例
2017/02/21 Javascript
JS数组搜索之折半搜索实现方法分析
2017/03/27 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
node作为中间服务层如何发送请求(发送请求的实现方法详解)
2018/01/02 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
2019/05/03 Javascript
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
javascript操作元素的常见方法小结
2019/11/13 Javascript
vue总线机制(bus)知识点详解
2020/05/10 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
两个命令把 Vim 打造成 Python IDE的方法
2016/03/20 Python
Python函数式编程
2017/07/20 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
python global和nonlocal用法解析
2020/02/03 Python
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
基于HTML5+Webkit实现树叶飘落动画
2017/12/28 HTML / CSS
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
市场营销调查计划书
2014/05/02 职场文书
学校运动会报道稿
2014/09/23 职场文书
2015年质量管理工作总结范文
2015/05/18 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
Django给表单添加honeypot验证增加安全性
2021/05/06 Python
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python