Python,super(,)函数用法总结
一、super( ) 的用途
了解 super() 函数之前,我们首先要知道 super() 的用途是啥?
二、了解 super 的基础信息
语法格式:
super([type[, object-or-type]])
函数描述:
返回一个代理对象,它会将方法调用委托给 type 的父类或兄弟类。
参数说明:
type —— 类,可选参数。object-or-type —— 对象或类,一般是 self,可选参数。
返回值:
super object —— 代理对象。
help 帮助信息:
>>> help(super) Help on class super in module builtins: class super(object) | super() -> same as super(__class__, <first argument>) | super(type) -> unbound super object | super(type, obj) -> bound super object; requires isinstance(obj, type) | super(type, type2) -> bound super object; requires issubclass(type2, type) | Typical use to call a cooperative superclass method: | class C(B): | def meth(self, arg): | super().meth(arg) | This works for class methods too: | class C(B): | @classmethod | def cmeth(cls, arg): | super().cmeth(arg) ... ...
三、典型用法
3.1 单继承问题
首先我们看一个最基本的子类调用父类方法的示例:
>>> class A: def funxx(self): print("执行 A 中的 funxx 方法 ... ...") >>> class B(A): def funxx(self): A.funxx(self) # 通过类名调用父类中的同名方法,self 参数代表 B 类的实例对象 b print("执行 B 中的 funxx 方法 ... ...") >>> b = B() >>> b.funxx() 执行 A 中的 funxx 方法 ... ... 执行 B 中的 funxx 方法 ... ...
使用 super() 函数来实现父类方法的调用:
>>> class A: def funxx(self): print("执行 A 中的 funxx 方法 ... ...") >>> class B(A): def funxx(self): super().funxx() print("执行 B 中的 funxx 方法 ... ...") >>> b = B() >>> b.funxx() 执行 A 中的 funxx 方法 ... ... 执行 B 中的 funxx 方法 ... ...
3.2 单继承问题拓展
在 help()
的帮助信息中,也说明了类中使用 super()
不带参数的形式等同于 super(__class__, <first argument>)
这种形式。这也是 Python 2.x 和 Python 3.x 关于 super()
的区别。
改写之前的单继承问题的代码:
>>> class A: def funxx(self): print("执行 A 中的 funxx 方法 ... ...") >>> class B(A): def funxx(self): super(B, self).funxx() print("执行 B 中的 funxx 方法 ... ...") >>> b = B() >>> b.funxx() 执行 A 中的 funxx 方法 ... ... 执行 B 中的 funxx 方法 ... ...
示例:
class A: pass class B(A): pass class C(A): def funxx(self): print("找到 funxx() 位于 C 中...") class D(A): pass class E(B, C): pass class F(E, D): def funff(self): print("执行 F 中的 funff()...") super(E, self).funxx() print(f"F 类的 MRO : {F.__mro__}") f = F() f.funff()
运行结果:
F 类的 MRO : (<class '__main__.F'>, <class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>) 执行 F 中的 funff()... 找到 funxx() 位于 C 中...
3.3 重复调用问题
重复调用问题 也称 钻石继承问题 或 菱形图问题。
先来看看普通调用方法在:
>>> class A: def __init__(self): print("打印属性 a") >>> class B(A): def __init__(self): print("打印属性 b") A.__init__(self) >>> class C(A): def __init__(self): print("打印属性 c") A.__init__(self) >>> class D(B, C): def __init__(self): print("打印属性 d") B.__init__(self) C.__init__(self) >>> d = D() 打印属性 d 打印属性 b 打印属性 a 打印属性 c 打印属性 a
接下来我们使用 super() 函数来调用:
>>> class A: def __init__(self): print("打印属性 a") >>> class B(A): def __init__(self): print("打印属性 b") super().__init__() # super() 等同于 super(B, self) >>> class C(A): def __init__(self): print("打印属性 c") super().__init__() # super() 等同于 super(C, self) >>> class D(B, C): def __init__(self): print("打印属性 d") super(D, self).__init__() >>> d = D() 打印属性 d 打印属性 b 打印属性 c 打印属性 a
3.4 super(type) 问题
>>> class A: def funxx(self): print("...A...") >>> class B(A): def funxx(self): print("...B...") >>> sa = super(B) >>> print(sa) <super: <class 'B'>, NULL> >>> print(type(sa)) <class 'super'>
可以看出 super(type) 返回的是一个无效的对象,或者是未绑定的 super object。
到此这篇关于Python super( )函数用法总结的文章就介绍到这了,更多相关super( )函数内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!
推荐阅读
-
Python中怎么动态声明变量赋值
这篇文章将为大家详细讲解有关Python中怎么动态声明变量赋值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文...
-
python中变量的存储原理是什么
-
Python中怎么引用传递变量赋值
这篇文章将为大家详细讲解有关Python中怎么引用传递变量赋值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文...
-
python中怎么获取程序执行文件路径
python中怎么获取程序执行文件路径,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的...
-
Python中如何获取文件系统的使用率
Python中如何获取文件系统的使用率,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴...
-
Python中怎么获取文件的创建和修改时间
这篇文章将为大家详细讲解有关Python中怎么获取文件的创建和修改时间,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读...
-
python中怎么获取依赖包
今天就跟大家聊聊有关python中怎么获取依赖包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据...
-
python怎么实现批量文件加密功能
-
python中怎么实现threading线程同步
小编给大家分享一下python中怎么实现threading线程同步,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!...
-
python下thread模块创建线程的方法
本篇内容介绍了“python下thread模块创建线程的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来...