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 相关文章推荐
win7安装python生成随机数代码分享
Dec 27 Python
跟老齐学Python之集合(set)
Sep 24 Python
简单谈谈Python流程控制语句
Dec 04 Python
python中正则表达式的使用方法
Feb 25 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
简单谈谈python基本数据类型
Sep 26 Python
PyCharm配置mongo插件的方法
Nov 30 Python
对Python协程之异步同步的区别详解
Feb 19 Python
Python如何发送与接收大型数组
Aug 07 Python
Python爬虫如何破解JS加密的Cookie
Nov 19 Python
Python对excel的基本操作方法
Feb 18 Python
python工具dtreeviz决策树可视化和模型可解释性
Mar 03 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数据库调用类调用实例(详细注释)
2012/07/12 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
javascript与CSS复习(二)
2010/06/29 Javascript
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
基于jquery循环map功能的代码
2011/02/26 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
JavaScript实现页面5秒后自动跳转的方法
2015/04/16 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
js变量提升深入理解
2016/09/16 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
jquery编写日期选择器
2017/03/16 Javascript
js图片放大镜效果实现方法详解
2020/10/28 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
js实现淘宝浏览商品放大镜功能
2020/10/28 Javascript
Vue router传递参数并解决刷新页面参数丢失问题
2020/12/02 Vue.js
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
Python实现一个简单的MySQL类
2015/01/07 Python
python函数装饰器用法实例详解
2015/06/04 Python
Python中static相关知识小结
2018/01/02 Python
Python寻找两个有序数组的中位数实例详解
2018/12/05 Python
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
网络体系结构及协议的定义
2014/03/13 面试题
乔迁宴答谢词
2014/01/21 职场文书
园林系毕业生求职信
2014/06/23 职场文书
商场周年庆活动方案
2014/08/19 职场文书
PyTorch 如何自动计算梯度
2021/05/23 Python
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js