Python3里的super()和__class__使用介绍
作者:依云 发布时间:2022-06-27 09:29:35
子类里访问父类的同名属性,而又不想直接引用父类的名字,因为说不定什么时候会去修改它,所以数据还是只保留一份的好。其实呢,还有更好的理由不去直接引用父类的名字,参见 Python's super() considered super! | Deep Thoughts by Raymond Hettinger。
这时候就该 super() 登场啦——
class A:
def m(self):
print('A')
class B(A):
def m(self):
print('B')
super().m()
B().m()
当然 Python 2 里 super() 是一定要参数的,所以得这么写:
class B(A):
def m(self):
print('B')
super(B, self).m()
需要提到自己的名字。这个名字也是动态查找的,在这种情况下替换第三方库中的类会出问题。
super() 很好地解决了访问父类中的方法的问题。那么,如果要访问父类的父类(准确地说,是方法解析顺序(MRO)中位于第三的类)的属性呢?
比如,B 类是继承 A 的,它重写了 A 的 m 方法。现在我们需要一个 C 类,它需要 B 类的一些方法,但是不要 B 的 m 方法,而改用 A 的。怎么间接地引用到 A 的 m 方法呢?使用self.__class__肯定是不行的,因为 C 还可能被进一步继承。
从文档中我注意到,super 的实现是通过插入一个名为 __class__ 的名字来实现的(super 会从调用栈里去查找这个 __class__ 名字)。所以,就像文档里暗示的,其实可以直接在定义方法时访问 __class__ 名字,它总是该方法被定义的类。继续我们的单字母类:
class C(B):
def m(self):
print('C')
# see the difference!
print(__class__.__mro__)
print(self.__class__.__mro__)
__class__.__mro__[2].m(self)
class D(C):
def m(self):
print('D')
super().m()
o = D()
o.m()
会得到:
D
C
(<class 't.C'>, <class 't.B'>, <class 't.A'>, <class 'object'>)
(<class 't.D'>, <class 't.C'>, <class 't.B'>, <class 't.A'>, <class 'object'>)
A
不过,PyPy 并不支持这个 __class__ 名字。


猜你喜欢
- 今天从windows上导出一个sql执行文件,再倒入到unbutn中,结果出现乱码,折腾7-8分钟, 解决方式 在导出mysql sql执行
- 不能再向以前一样使用model.add(Merge([Model1,Model2]))必须使用函数式out = Concatenate()(
- 相信大家在日常的开发中经常会碰到榜单类的活动需求,通常在榜单中都会要求返回排名,今天我们就用MySQL的窗口函数来快速实现一下首先,先建一个
- Mysql调优Explain工具详解以及实战演练 Explain工具介绍Explain分析示例explain 两个变种explain中的列
- python五子棋原创算法,供大家参考,具体内容如下我们都见过五子棋,但是在我看来五子棋单机游戏中,逻辑赢法很重要,经常用到的算法是五子连珠
- 本文实例讲述了python中的闭包用法。分享给大家供大家参考。具体分析如下:什么是闭包?简单说,闭包就是根据不同的配置信息得到不同的结果再来
- 本文实例讲述了Windows平台Python连接sqlite3数据库的方法。分享给大家供大家参考,具体如下:之前没有接触过sqlite数据库
- 本文介绍了四种asp导出excel数据的方法:1.使用OWC ,2.用Excel的Application组件,3.直接在IE中打开,4.导出
- 功能函数// 绘制圆角矩形void DrawRotatedRectChamfer(cv::Mat mask,const cv::Rotate
- 样例:1.创建vue项目,不再详述2.引入vant之前用过很多插件做这个功能,但是效果都不尽人意,出现各种问题,直到遇到vant这个插件,完
- 问题你要通过网络连接发送和接受连续数据的大型数组,并尽量减少数据的复制操作。解决方案下面的函数利用 memoryviews 来发送和接受大数
- 1.创建多线程类全局变量 secclass work_thread(QThread): timer = pyqtSignal() # 每隔一
- 开发Web应用时,你经常要加上搜索功能。甚至还不知能要搜什么,就在草图上画了一个放大镜。搜索是项非常重要的功能,所以像elasticsear
- 实例如下所示:# -*- coding: utf-8 -*-#to find where use the table on xxxxx xx
- 前言在实际业务场景中,我们有时候会碰到一些延时的需求:例如,在电商平台,运营在管理后台添加商品后,不需要立刻展示在前台,而是在之后某个时间点
- 导语之前有很多小伙伴说想学习一下多线程图片下载器,虽然好像已经过去很久了,不过还是上来安排一波吧。至于题目为什么说是构建一个小型数据集,因为
- 1.imutils功能简介imutils是在OPenCV基础上的一个封装,达到更为简结的调用OPenCV接口的目的,它可以轻松的实现图像的平
- 环境内容:Pyhon版本:3.7.1scikit_learn==0.20.0graphviz==0.8.4numpy==1.15.3pand
- 事件处理,是 GUI 程序中不可或缺的重要组成部分,相比来说,控件只是组成一台机器的零部件, 而事件处理则是驱动这台机器&ldquo
- 来自John Resig早年的文章,大致翻译了一下,以作备忘。 令人高兴的是,我想我终于可以说,“现在,JavaScript的Getters