位置: 编程技术 - 正文

Python中super()函数简介及用法分享(super函数python)

编辑:rootadmin

推荐整理分享Python中super()函数简介及用法分享(super函数python),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python super.__init__用法,python中super()方法,python中super()方法,python中super()方法,python中super()方法,python中super函数的用法,python中super函数,python中super函数,内容如对您有帮助,希望把文章链接给更多的朋友!

首先看一下super()函数的定义:

super([type [,object-or-type]])

Return a **proxy object** that delegates method calls to a **parent or sibling** class of type.

返回一个代理对象, 这个对象负责将方法调用分配给第一个参数的一个父类或者同辈的类去完成.

parent or sibling class 如何确定&#;

第一个参数的__mro__属性决定了搜索的顺序, super指的的是 MRO(Method Resolution Order) 中的下一个类, 而不一定是父类!

super()和getattr() 都使用__mro__属性来解析搜索顺序, __mro__实际上是一个只读的元组.

MRO中类的顺序是怎么排的呢&#;

实际上MRO列表本身是根据一种C3的线性化处理技术确定的, 理论说明可以参考这里, 这里只简单说明一下原则:

在MRO中, 基类永远出现在派生类的后面, 如果有多个基类, 基类的相对顺序不变.

MRO实际上是对继承树做层序遍历的结果, 把一棵带有结构的树变成了一个线性的表, 所以沿着这个列表一直往上, 就可以无重复的遍历完整棵树, 也就解决了多继承中的Diamond问题.

比如说:

super()实际返回的是一个代理的super对象!

调用super()这个构造方法时, 只是返回一个super()对象, 并不做其他的操作.

然后对这个super对象进行方法调用时, 发生的事情如下:

Python中super()函数简介及用法分享(super函数python)

找到第一个参数的__mro__列表中的下一个直接定义了该方法的类, 并实例化出一个对象然后将这个对象的self变量绑定到第二个参数上, 返回这个对象

举个例子:

在A的构造方法中, 先调用super()得到一个super对象, 然后向这个对象调用init方法, 这是super对象会搜索A的__mro__列表, 找到第一个定义了__init__方法的类, 于是就找到了Root, 然后调用Root.__init__(self), 这里的self是super()的第二个参数, 是编译器自动填充的, 也就是A的__init__的第一个参数, 这样就完成对__init__方法调用的分配.

注意: 在许多语言的继承中, 子类必须调用父类的构造方法, 就是为了保证子类的对象能够填充上父类的属性! 而不是初始化一个父类对象...(我之前就一直是这么理解的..). Python中就好多了, 所谓的调用父类构造方法, 就是明明白白地把self传给父类的构造方法, 我的小身子骨就这么交给你了, 随便你怎么折腾吧:joy:

参数说明

如果提供了第二个参数, 则找到的父类对象的self就绑定到这个参数上, 后面调用这个对象的方法时, 可以自动地隐式传递self.如果第二个参数是一个对象, 则isinstance(obj, type)必须为True. 如果第二个参数为一个类型, 则issubclass(type2, type)必须为True

如果没有传递第二个参数, 那么返回的对象就是Unbound, 调用这个unbound对象的方法时需要手动传递第一个参数, 类似于Base.__int__(self, a, b).

不带参数的super()只能用在类定义中(因为依赖于caller的第二个参数), 编译器会自动根据当前定义的类填充参数.也就是说, 后面所有调用super返回对象的方法时, 第一个参数self都是super()的第二个参数. 因为Python中所谓的方法, 就是一个第一个参数为self的函数, 一般在调用方法的时候a.b()会隐式的将a赋给b()的第一个参数.

super()的两种常见用法:

单继承中, super用来指代隐式指代父类, 避免直接使用父类的名字多继承中, 解决Diamond问题 (TODO)

对面向对象的理解

其实我觉得Python里面这样的语法更容易理解面向对象的本质, 比Java中隐式地传this更容易理解.

所谓函数, 就是一段代码, 接受输入, 返回输出. 所谓方法, 就是一个函数有了一个隐式传递的参数. 所以方法就是一段代码, 是类的所有实例共享的, 唯一不同的是各个实例调用的时候传给方法的this 或者self不一样而已.

构造方法是什么呢&#; 其实也是一个实例方法啊, 它只有在对象生成了之后才能调用, 所以Python中__init__方法的参数是self啊. 调用构造方法时其实已经为对象分配了内存, 构造方法只是起到初始化的作用, 也就是为这段内存里面赋点初值而已.

Java中所谓的静态变量其实也就是类的变量, 其实也就是为类也分配了内存, 里面存了这些变量, 所以Python中的类对象我觉得是很合理的, 也比Java要直观. 至于静态方法, 那就与对象一点关系都没有了, 本质就是个独立的函数, 只不过写在了类里面而已. 而Python中的classmethod其实也是一种静态方法, 不过它会依赖于cls对象, 这个cls就是类对象, 但是只要想用这个方法, 类对象必然是存在的, 不像实例对象一样需要手动的实例化, 所以classmethod也可以看做是一种静态变量. 而staticmethod就是真正的静态方法了, 是独立的函数, 不依赖任何对象.

Java中的实例方法是必须依赖于对象存在的, 因为要隐式的传输this, 如果对象不存在这个this也没法隐式了. 所以在静态方法中是没有this指针的, 也就没法调用实例方法. 而Python中的实例方法是可以通过类名来调用的, 只不过因为这时候self没办法隐式传递, 所以必须得显式地传递.

Python编写简单的HTML页面合并脚本 最近写一个BootStrap页面...因为功能需要所以决定一个页面解决所有问题,然后用jQuery来动态显示功能....然而这样做的话页面会相当庞大,一堆隐藏模态

Python中的异常处理相关语句基础学习笔记 异常是指因为程序出现了错误而在正常控制流以外采取的行动,其分为两个阶段,第一阶段是引发异常的错误,当系统检测到错误并且意识到异常条件

Python的SQLalchemy模块连接与操作MySQL的基础示例 一、SQLalchemy简介SQLAlchemy是一个开源的SQL工具包,基本Python编程语言的MIT许可证而发布的对象关系映射器。SQLAlchemy提供了一个熟知的企业级全套持久性

标签: super函数python

本文链接地址:https://www.jiuchutong.com/biancheng/386964.html 转载请保留说明!

上一篇:Swift中的协议(protocol)学习教程(swift协议范型)

下一篇:Python编写简单的HTML页面合并脚本(python编写简单的计算器加减乘除)

  • 小规模纳税人怎么变成一般纳税人
  • 月薪3万个人所得税是多少
  • 房屋租赁印花税怎么算
  • 企业所得税负担变动率
  • 简易计税是什么意思?
  • 销售农产品是否可以抵税
  • 从合伙企业分回的经营所得 合伙企业 个人所得税
  • 未达起征点可以开专票吗
  • 什么是居民纳税人
  • 未确认收入可以开发票吗
  • 提前预支费用怎么写
  • 海关缴款书税号
  • 企业接受捐赠是营业收入吗
  • 分项结转分步法例题及分录
  • 计提增值税附加税的会计科目
  • 广告服务印花税怎么交
  • 主营业务税金及附加大概比例
  • 装修费税率是多少2021
  • 商铺 公司
  • 公司买汽车怎么做内账
  • 工程竣工结算审查期限
  • 补缴以前税收滞纳金多少
  • 资产减值损失月末需要结转吗
  • 直接转让土地使用权 土地增值税申报表
  • 银行端现金缴税凭证
  • 小规模固定资产一次性扣除
  • 加计抵减怎么做账务处理小企业会计准则
  • 公司借法人的钱超过一年
  • PHP:mb_ereg_search_pos()的用法_mbstring函数
  • 松木山在哪
  • 付的押金冲抵部分怎么算
  • et.exe进程占用
  • PHP:connection_status()的用法_misc函数
  • 领用材料已抵扣进项税
  • 个体户未达起征点需要申报吗
  • 外币交易是什么意思
  • 通讯补贴计入工资薪金吗
  • php面向对象优点,缺点
  • 侧边导航栏点击后再展开
  • uni-app是干嘛的
  • React面试题最全
  • PHP自定义函数实现计算机整数的四次方
  • 固定资产清理的会计科目处理
  • 小型微利企业如何进行税收筹划
  • 员工办理健康证需要什么材料
  • 购买商品优惠怎么做账
  • 计提电费的会计分录怎么写
  • 简易征收的进项税额转出
  • 海关进口增值税专用缴款书
  • 不动产初始登记证明
  • 增值税一般纳税人认定标准
  • 运输公司自有车辆是什么意思
  • 计提的利息汇算清缴时要调整吗
  • 离岸服务外包收入
  • 库存商品与存货总额之比
  • 提交印花税会计分录
  • 等额年金终值系数与偿债资金系数互为倒数
  • 资产状况信息公示还是不公示
  • 流动资产周转天数下降说明什么
  • 作废发票丢了罚款多少
  • mysql5.6 创建用户
  • Linux系统下mysqlcheck修复数据库命令(详解)
  • 虚拟机中的centos怎么联网
  • linux系统百科
  • ensmix32.exe进程安全吗 ensmix32进程是什么文件产生的
  • window10如何校色
  • perl-v
  • cocos2dx 3.17
  • 浅谈jquery中ajax跨域提交的时候会有2次请求的问题
  • unicode和utf–8 编码
  • Web Safe Color Pallette
  • perl中打开文件
  • jquery源码分析笔记
  • 如何获取硬盘所有文件的列表
  • unity资源文件
  • 关于jQuery中的DOM操作,下列哪种方法用来复制元素?
  • jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
  • 工会经费扣除标准2022
  • 自然人电子税务局(扣缴端)怎么添加公司
  • 用于直接销售消费品的消费税计入
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设