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 15 Python
基于python实现微信模板消息
Dec 21 Python
python生成excel的实例代码
Nov 08 Python
Python实现简单遗传算法(SGA)
Jan 29 Python
Python使用Phantomjs截屏网页的方法
May 17 Python
python模块之subprocess模块级方法的使用
Mar 26 Python
python requests使用socks5的例子
Jul 25 Python
python 利用pyttsx3文字转语音过程详解
Sep 25 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 Python
Pycharm自动添加文件头注释和函数注释参数的方法
Oct 23 Python
Django中celery的使用项目实例
Jul 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+ajax实现图片文件上传功能实例
2014/06/17 PHP
PHP向浏览器输出内容的4个函数总结
2014/11/17 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
Laravel框架实现多数据库连接操作详解
2019/07/12 PHP
基于laravel-admin 后台 列表标签背景的使用方法
2019/10/03 PHP
laravel实现上传图片,并且制作缩略图,按照日期存放的代码
2019/10/16 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
用js怎么把&字符换成"&amp:"
2006/10/19 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
angular forEach方法遍历源码解读
2017/01/25 Javascript
vue动态绑定class选中当前列表变色的方法示例
2018/12/19 Javascript
node.js命令行教程图文详解
2019/05/27 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
vue组件创建的三种方式小结
2020/02/03 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
[01:06]欢迎来到上海,TI9
2018/08/26 DOTA
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
python爬虫之百度API调用方法
2017/06/11 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
python使用pygame模块实现坦克大战游戏
2020/03/25 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
Python使用requests模块爬取百度翻译
2020/08/25 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
致长跑运动员广播稿
2014/01/31 职场文书
马智宇婚礼主持词
2014/03/22 职场文书
公证书标准格式
2014/04/10 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
2014年学生会工作总结范文
2014/11/07 职场文书
如何使用vue3打造一个物料库
2021/05/08 Vue.js
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle