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内置函数之filter map reduce介绍
Nov 30 Python
Python实现求最大公约数及判断素数的方法
May 26 Python
Python网络编程 Python套接字编程
Sep 13 Python
利用numpy实现一、二维数组的拼接简单代码示例
Dec 15 Python
Python中collections模块的基本使用教程
Dec 07 Python
使用python将请求的requests headers参数格式化方法
Jan 02 Python
Python实现使用request模块下载图片demo示例
May 24 Python
Python使用字典实现的简单记事本功能示例
Aug 15 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 Python
哪些是python中web开发框架
Jun 17 Python
判断Python中的Nonetype类型
May 25 Python
python使用BeautifulSoup 解析HTML
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缓冲 output_buffering的使用详解
2013/06/13 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
2016/06/13 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
老生常谈javascript的类型转换
2016/10/12 Javascript
js获取ip和地区
2017/03/10 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
JS实现轮播图效果
2020/01/11 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
Python程序退出方式小结
2017/12/09 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
Python控制键盘鼠标pynput的详细用法
2019/01/28 Python
Python中文编码知识点
2019/02/18 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
用python的turtle模块实现给女票画个小心心
2019/11/23 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
HTML5里autofocus自动聚焦属性使用介绍
2016/06/22 HTML / CSS
德国高端单身人士交友网站:ElitePartner
2018/12/02 全球购物
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
师范生自我鉴定范文
2013/10/05 职场文书
内容编辑个人求职信
2013/12/10 职场文书
大二学生学习个人自我评价
2014/01/19 职场文书
薪酬专员岗位职责
2014/02/18 职场文书
GMP办公室主任岗位职责
2014/03/14 职场文书
横空出世观后感
2015/06/09 职场文书
退休欢送会致辞
2015/07/31 职场文书
旅游安全责任协议书
2016/03/22 职场文书
Mysql中存储引擎的区别及比较
2021/06/04 MySQL
Python列表的索引与切片
2022/04/07 Python
python和anaconda的区别
2022/05/06 Python