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使用正则表达式检测密码强度源码分享
Jun 11 Python
Python创建系统目录的方法
Mar 11 Python
python递归计算N!的方法
May 05 Python
详解Python中映射类型的内建函数和工厂函数
Aug 19 Python
利用python爬取斗鱼app中照片方法实例
Dec 03 Python
Python+request+unittest实现接口测试框架集成实例
Mar 16 Python
Python 查找字符在字符串中的位置实例
May 02 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
Nov 08 Python
浅析python内置模块collections
Nov 15 Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 Python
Python爬取微信小程序通用方法代码实例详解
Sep 29 Python
python中数组和列表的简单实例
Mar 25 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中Session的概念
2006/10/09 PHP
PHP PDO函数库详解
2010/04/27 PHP
使用PHP实现密保卡功能实现代码<打包下载直接运行>
2011/10/09 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
YII实现分页的方法
2014/07/09 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
2013/06/14 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
JavaScript中String.prototype用法实例
2015/05/20 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
大学生蛋糕店创业计划书
2014/01/13 职场文书
乡镇安全生产目标责任书
2014/07/23 职场文书
公安领导班子四风问题个人整改措施思想汇报
2014/10/09 职场文书
网聊搭讪开场白
2015/05/28 职场文书
元旦联欢晚会主持词
2015/07/01 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书
Python深度学习之Pytorch初步使用
2021/05/20 Python