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线程的两种编程方式
Apr 14 Python
基于Python实现通过微信搜索功能查看谁把你删除了
Jan 27 Python
tensorflow 1.0用CNN进行图像分类
Apr 15 Python
Python引用计数操作示例
Aug 23 Python
numpy给array增加维度np.newaxis的实例
Nov 01 Python
Django中更改默认数据库为mysql的方法示例
Dec 05 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
Python异常处理例题整理
Jul 07 Python
Python timeit模块的使用实践
Jan 13 Python
Python拼接字符串的7种方式详解
Mar 19 Python
Python如何对XML 解析
Jun 28 Python
Django:使用filter的pk进行多值查询操作
Jul 15 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 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
php切割页面div内容的实现代码分享
2012/07/31 PHP
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
php检查页面是否被百度收录
2015/10/28 PHP
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
jQuery+ThinkPHP+Ajax实现即时消息提醒功能实例代码
2017/03/21 jQuery
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
Javascript删除数组里的某个元素
2019/02/28 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
了解重排与重绘
2019/05/29 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
[02:08]2014DOTA2国际邀请赛 430专访:力争取得小组前二
2014/07/11 DOTA
Python中functools模块的常用函数解析
2016/06/30 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
python async with和async for的使用
2019/06/20 Python
简单了解python高阶函数map/reduce
2019/06/28 Python
Django的用户模块与权限系统的示例代码
2019/07/24 Python
python常用运维脚本实例小结
2020/02/14 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
Vans澳大利亚官网:购买鞋子、服装及配件
2019/09/05 全球购物
非功能性需求都包括哪些方面
2013/10/29 面试题
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
翻译学院毕业生自荐书
2014/02/02 职场文书
粗加工管理制度
2014/02/04 职场文书
升学宴主持词
2014/04/02 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
2014年信访工作总结
2014/11/17 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
小学班主任事迹材料
2014/12/17 职场文书
西游降魔篇观后感
2015/06/15 职场文书
自书遗嘱范文
2015/08/07 职场文书
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL
Vue router配置与使用分析讲解
2022/12/24 Vue.js