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 13 Python
Python3指定路径寻找符合匹配模式文件
May 22 Python
django框架自定义用户表操作示例
Aug 07 Python
python判断数字是否是超级素数幂
Sep 27 Python
Python打包方法Pyinstaller的使用
Oct 09 Python
python学生管理系统
Jan 30 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
Nov 05 Python
Django接收照片储存文件的实例代码
Mar 07 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
Apr 08 Python
Python中关于logging模块的学习笔记
Jun 03 Python
python正则表达式re.match()匹配多个字符方法的实现
Jan 27 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
基于mysql的论坛(3)
2006/10/09 PHP
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
2016/04/15 PHP
php-fpm添加service服务的例子
2018/04/27 PHP
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
简述Matlab中size()函数的用法
2016/03/20 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
javascript数据结构之串的概念与用法分析
2017/04/12 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
Python中time模块与datetime模块在使用中的不同之处
2015/11/24 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
python实现复制大量文件功能
2019/08/31 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
售后服务经理岗位职责
2014/02/25 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
个性与发展自我评价
2015/03/06 职场文书
Python OpenGL基本配置方式
2022/05/20 Python