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
  • asp之家 网络编程 m.aspxhome.com