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 Web框架Pylons中使用MongoDB的例子
Dec 03 Python
Python中的匿名函数使用简介
Apr 27 Python
python+pyqt5实现24点小游戏
Jan 24 Python
python的turtle库使用详解
May 10 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
Sep 06 Python
pyqt5、qtdesigner安装和环境设置教程
Sep 25 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
利用Python实现Excel的文件间的数据匹配功能
Jun 16 Python
python 调用API接口 获取和解析 Json数据
Sep 28 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
Nov 30 Python
如何查看python关键字
Jan 17 Python
Python如何导出导入所有依赖包详解
Jun 08 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
linux下为php添加curl扩展的方法
2011/07/29 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
PHP加密解密类实例代码
2016/07/20 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
JavaScript 解析读取XML文档 实例代码
2009/07/07 Javascript
JavaScript 函数调用规则
2009/09/14 Javascript
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
2014/07/21 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
一秒学会微信小程序制作table表格
2019/02/14 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
详解JavaScript之Array.reduce源码解读
2020/11/01 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
wxpython中自定义事件的实现与使用方法分析
2016/07/21 Python
怎样使用Python脚本日志功能
2016/08/14 Python
python numpy 显示图像阵列的实例
2018/07/02 Python
Python之时间和日期使用小结
2019/02/14 Python
在python image 中安装中文字体的实现方法
2019/08/22 Python
python批量修改xml属性的实现方式
2020/03/05 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
HTML5图片预览实例分享
2014/06/04 HTML / CSS
文明餐桌行动实施方案
2014/02/19 职场文书
高中英语演讲稿范文
2014/04/24 职场文书
公司任命书范本
2014/06/04 职场文书
中秋节活动总结
2014/08/29 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
2015初中团委工作总结
2015/07/28 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL