Python中super函数的用法
作者:neon_ 时间:2023-07-09 20:09:40
描述
super() 函数用于调用下一个父类(超类)并返回该父类实例的方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
语法
以下是 super() 方法的语法:
super(type[, object-or-type])
参数
type -- 类。
object-or-type -- 类,一般是 self
返回值
无。
实例
以下展示了使用 super 函数的实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
class FooParent(object):
def __init__(self):
self.parent = 'I\'m the parent.'
print ('Parent')
def bar(self,message):
print ("%s from Parent" % message)
class FooChild(FooParent):
def __init__(self):
# super(FooChild,self) 首先找到 FooChild 的父类(就是类 FooParent),然后把类B的对象 FooChild 转换为类 FooParent 的对象
super(FooChild,self).__init__()
print ('Child')
def bar(self,message):
super(FooChild, self).bar(message)
print ('Child bar fuction')
print (self.parent)
if __name__ == '__main__':
fooChild = FooChild()
fooChild.bar('HelloWorld')
执行结果:
Parent
Child
HelloWorld from Parent
Child bar fuction
I'm the parent.
python的类分别有新式类和经典类,都支持多继承。在类的继承中,如果你想要重写父类的方法而不是覆盖的父类方法,这个时候我们可以使用super()方法来实现
class C:
def minus(self,x):
return x/2
class D(C):
def minus(self,x):
super(D, self).minus()
print 'hello'
上面的代码中C是父类,D是子类,我们在D类重新定义了minus方法,就是在C类的功能基础基础上新添print 'hello'功能。super在这里的作用就是在子类中调用父类的方法,这个也是在单继承常见调用super()的用法。那么问题来了
class A:
def __init__(self):
self.n = 10
def minus(self, m):
self.n -= m
class B(A):
def __init__(self):
self.n = 7
def minus(self, m):
super(B,self).minus(m)
self.n -= 3
B()
B(2)
print b.n
那么上面的代码中b.n的输出是什么呢?为什么结果是2呢,而不是2呢?super(B,self).minus(m)明明是调用了父类的minus方法,可是输出结果就是5,是你要明白现在B的实例,而不是A的实例,那么传递的self.n的数值是7,而不是10.
来源:https://segmentfault.com/a/1190000012040723
标签:Python,super
0
投稿
猜你喜欢
地图网站的需求功能与体验
2009-03-01 11:15:00
简单的两种Extjs formpanel加载数据的方式
2023-07-02 05:19:24
SQL如何使用正则表达式对数据进行过滤
2024-01-26 23:15:05
Jquery作者John Resig自己封装的javascript 常用函数
2023-09-11 13:14:16
完美实现js选项卡切换效果(一)
2024-04-23 09:28:24
python 利用opencv实现图像网络传输
2023-05-27 12:52:16
Vue.js绑定HTML class数组语法错误的原因分析
2024-04-30 10:20:07
在Python3中初学者应会的一些基本的提升效率的小技巧
2022-04-05 12:55:28
简单谈谈Python中的闭包
2021-10-20 12:50:46
Go 每日一库之termtables的使用
2024-05-22 10:20:25
Python全局变量关键字global的简单使用
2022-01-29 11:03:49
SQL Server 2005中插入XML数据方法
2008-05-26 11:56:00
13个最常用的Python深度学习库介绍
2023-08-04 03:08:09
给JavaScript自定义一个Trim函数
2008-04-20 16:30:00
Python版名片管理系统
2021-08-28 18:51:22
浅谈Pycharm最有必要改的几个默认设置项
2021-10-13 05:33:38
python画条形图实例
2023-12-04 12:32:33
开源软件包和环境管理系统Anaconda的安装使用
2022-07-15 13:00:13
Python实现对excel文件列表值进行统计的方法
2022-08-08 17:42:23
Appium中scroll和drag_and_drop根据元素位置滑动
2023-03-16 23:34:38