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在多玩图片上下载妹子图的实现代码
Aug 13 Python
Python实现单词翻译功能
Jun 06 Python
python绘制双柱形图代码实例
Dec 14 Python
Python自定义一个类实现字典dict功能的方法
Jan 19 Python
python统计指定目录内文件的代码行数
Sep 19 Python
对tensorflow 中tile函数的使用详解
Feb 07 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
keras实现多种分类网络的方式
Jun 11 Python
Python如何测试stdout输出
Aug 10 Python
Python+kivy BoxLayout布局示例代码详解
Dec 28 Python
使用python如何删除同一文件夹下相似的图片
May 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开源建站平台小结
2010/04/22 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
ajax读取数据后使用jqchart显示图表的方法
2015/06/10 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
使用FileReader API创建Vue文件阅读器组件
2018/04/03 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
python开发中range()函数用法实例分析
2015/11/12 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
中职应届生会计求职信
2013/10/23 职场文书
热能动力工程毕业生自荐信
2013/11/07 职场文书
土木工程专业个人求职信
2013/12/30 职场文书
通信生自我鉴定
2014/01/18 职场文书
秋游活动策划方案
2014/02/16 职场文书
学生操行评语大全
2014/04/24 职场文书
难忘的一天教学反思
2014/04/30 职场文书
交通事故协议书范文
2014/10/23 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
oracle连接ODBC sqlserver数据源的详细步骤
2021/07/25 Oracle
25张裸眼3D图片,带你重温童年的记忆,感受3D的魅力
2022/02/06 杂记