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实现计算倒数的方法
Jul 11 Python
Mac 上切换Python多版本
Jun 17 Python
Python生成数字图片代码分享
Oct 31 Python
python学习笔记之列表(list)与元组(tuple)详解
Nov 23 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
Python selenium实现微博自动登录的示例代码
May 16 Python
python实现移位加密和解密
Mar 22 Python
python文件读写代码实例
Oct 21 Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
Sep 25 Python
在vscode中启动conda虚拟环境的思路详解
Dec 25 Python
Python3使用Selenium获取session和token方法详解
Feb 16 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递归返回值时出现的问题解决办法
2013/02/19 PHP
php编程每天必学之表单验证
2016/03/01 PHP
php简单统计在线人数的方法
2016/05/10 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
js触发select onchange事件的小技巧
2014/08/05 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
详解Javascript 中的 class、构造函数、工厂函数
2017/12/20 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
2018/08/24 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
Python 3.8正式发布重要新功能一览
2019/10/17 Python
学习python需要有编程基础吗
2020/06/02 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
英国旅游额外服务市场领导者:Holiday Extras(机场停车场、酒店、接送等)
2017/10/07 全球购物
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
数控技术学生的自我评价
2014/02/15 职场文书
投资协议书范本
2014/04/21 职场文书
个人求职信范文
2014/05/24 职场文书
会计专业自荐信
2014/06/03 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
2014年学前班工作总结
2014/12/08 职场文书
2015年街道办事处工作总结
2015/05/22 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android