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实现去除下载电影和电视剧文件名中的多余字符的方法
Sep 23 Python
python删除本地夹里重复文件的方法
Nov 19 Python
Python日志模块logging基本用法分析
Aug 23 Python
对python3新增的byte类型详解
Dec 04 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
python利用openpyxl拆分多个工作表的工作簿的方法
Sep 27 Python
Windows系统下pycharm中的pip换源
Feb 23 Python
Python Django form 组件动态从数据库取choices数据实例
May 19 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
Jun 03 Python
利用Python实现Excel的文件间的数据匹配功能
Jun 16 Python
Python scrapy爬取小说代码案例详解
Jul 09 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 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
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
php对mongodb的扩展(初出茅庐)
2012/11/11 PHP
php自动加载机制的深入分析
2013/06/08 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
给网站上的广告“加速”显示的方法
2007/04/08 Javascript
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
详解vue-router 2.0 常用基础知识点之router-link
2017/05/10 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
vue的for循环使用方法
2019/02/12 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
vue 将多个过滤器封装到一个文件中的代码详解
2020/09/05 Javascript
Python下rrdtool模块的基本使用方法
2015/11/13 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
美国网上订购鲜花:FTD
2016/09/23 全球购物
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
用C或者C++语言实现SOCKET通信
2015/02/24 面试题
入党申请人的自我鉴定
2013/12/01 职场文书
30年同学聚会邀请函
2014/01/25 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技