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 strip()函数 介绍
May 24 Python
通过Python 接口使用OpenCV的方法
Apr 02 Python
在SQLite-Python中实现返回、查询中文字段的方法
Jul 17 Python
Python目录和文件处理总结详解
Sep 02 Python
python实现的汉诺塔算法示例
Oct 23 Python
Pandas时间序列基础详解(转换,索引,切片)
Feb 26 Python
linux 下selenium chrome使用详解
Apr 02 Python
python如何安装下载后的模块
Jul 03 Python
基于python实现判断字符串是否数字算法
Jul 10 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 Python
python中类与对象之间的关系详解
Dec 16 Python
解决hive中导入text文件遇到的坑
Apr 07 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 和 MYSQL
2006/10/09 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
javascript之ESC(第二类混淆)
2007/05/06 Javascript
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
js实现网页自动刷新可制作节日倒计时效果
2014/05/27 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
[41:52]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第二场 2月22日
2021/03/11 DOTA
python操作gmail实例
2015/01/14 Python
Python生成器(Generator)详解
2015/04/13 Python
在Python的Django框架中包装视图函数
2015/07/20 Python
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
如何用Python 加密文件
2020/09/10 Python
Django使用django-simple-captcha做验证码的实现示例
2021/01/07 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
旅游管理毕业生自荐信
2013/11/05 职场文书
十八大演讲稿
2014/05/22 职场文书
社区平安建设方案
2014/05/25 职场文书
技术股份合作协议书
2014/10/05 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
靠谱准确的求职信
2019/04/02 职场文书
经典人生语录分享:不畏将来,不念过去,笑对当下
2019/12/12 职场文书
python实现批量提取指定文件夹下同类型文件
2021/04/05 Python
了解MySQL查询语句执行过程(5大组件)
2022/08/14 MySQL
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL