先来看一段代码:

定义一个名叫People的父类,又定义了一个叫Teacher的老师类和一个叫Student的学生类

来继承People的类,并根据这两个子类实例化出两个对象s1和t1

class Date:
def __init__(self,year,mon,day):
self.year=year
self.mon=mon
self.day=day def birth_info(self):
print("The birth is %s-%s-%s"%(self.year,self.mon,self.day)) class People:
def __init__(self,name,age):
self.name=name
self.age=age def walk(self):
print("%s is walking"%self.name) class Teacher(People):
def __init__(self,name,age,year,mon,day,course):
People.__init__(self,name,age)
self.course=course
self.birth=Date(year,mon,day) def teach(self):
print("%s is teaching"%self.name) class Student(People):
def __init__(self,name,age,year,mon,day,group):
People.__init__(self,name,age)
self.birth = Date(year, mon, day)
self.group=group def study(self):
print("%s is studying"%self.name)
t1=Teacher("alex",28,1989,9,2,"python")
s1=Student("jack",22,1995,2,8,"group2")

现在问题来了,假如因为需要,我要修改老师类和学生类的父类People的名字。

这样一来,在老师类Teacher和学生类Student中继承的类People也要修改,以及它们

调用的init方法的那个父类也要修改名字,太麻烦了有没有?

这时候就可以使用super()这个内置函数来搞定了。

在python解释器中查看帮助信息:

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)

super是一个内置函数,加括号就得到一个对象,对象super()加"."可以直接调用父类的init方法。

这个对象在调用父类的init时,实际上就是在调用父类的绑定方法,所以就不需要在括号里加上self了。

修改后的代码如下:

class Date:
def __init__(self,year,mon,day):
self.year=year
self.mon=mon
self.day=day def birth_info(self):
print("The birth is %s-%s-%s"%(self.year,self.mon,self.day)) class People:
def __init__(self,name,age):
self.name=name
self.age=age def walk(self):
print("%s is walking"%self.name) class Teacher(People):
def __init__(self,name,age,year,mon,day,course):
super().__init__(name,age)
self.course=course
self.birth=Date(year,mon,day) def teach(self):
print("%s is teaching"%self.name) class Student(People):
def __init__(self,name,age,year,mon,day,group):
super().__init__(name,age)
self.birth = Date(year, mon, day)
self.group=group def study(self):
print("%s is studying"%self.name)
t1=Teacher("alex",28,1989,9,2,"python")
s1=Student("jack",22,1995,2,8,"group2")

这样一来,父类的名字改变了,代码里面继承的父类的init方法的名字也不需要修改了。

python2中,也可以使用super,其调用方法为:super(Teacher,self)

使用super()函数时,python会在mro列表中继续搜索下一个类。

只要每个重定义的方法统一使用super()并只调用它一次,那么控制流最终会遍历完整个mro列表。每个方法只会调用一次。
使用super调用的所有的属性,都是从mro列表当前的位置往后找,看mro列表的顺序就可以看到子类的继承关系

查看上面代码中Teacher这个子类的mro列表可以使用这个方法:

Teacher.mro()

使用super可以避免使用多重继承时,子类继承父类的顺序问题。

子类继承父类的数据属性和函数属性时,先执行的先生效,当后面的代码与前面的代码有冲突时,

后面的代码会把前面的代码覆盖掉,不使用super时需要自己解决继承的顺序问题,使用super就可以很好的解决这个问题了。

面向对象编程之super内置函数的用法的更多相关文章

  1. freemarker内置函数和用法

    原文链接:http://www.iteye.com/topic/908500 在我们应用Freemarker 过程中,经常会操作例如字符串,数字,集合等,却不清楚Freemrker 有没有类似于Jav ...

  2. [SQL]SUTFF内置函数的用法 (删除指定长度的字符并在指定的起始点插入另一组字符)

    STUFF 删除指定长度的字符并在指定的起始点插入另一组字符. 语法 STUFF ( character_expression , start , length , character_express ...

  3. enumerate next eval reload 内置函数的用法

    enumerate next eval reload 内置函数的用法 #enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用 ...

  4. Python内置函数reversed()用法分析

    Python内置函数reversed()用法分析 这篇文章主要介绍了Python内置函数reversed()用法,结合实例形式分析了reversed()函数的功能及针对序列元素相关操作技巧与使用注意事 ...

  5. $Python常用内置函数典型用法

    Python中有许多功能丰富的内置函数,本文基于Python 2.7,就常用的一些函数的典型用法做一些积累,不断更新中. sorted函数的三种用法 # coding:utf-8 # sorted函数 ...

  6. 面向对象super内置函数(转)

    super函数用来解决钻石继承. 一.python的继承以及调用父类成员 父类: class Base(object): def __init__(self): print("base in ...

  7. [SQL]SUTFF内置函数的用法

    STUFF 删除指定长度的字符并在指定的起始点插入另一组字符. 语法 STUFF ( character_expression , start , length , character_express ...

  8. python内置函数getattr用法

    class Tests(object):    #定义类     aaa = '10'          #定义变量       def test(self):     #定义类的方法test     ...

  9. Freemarker 内置函数 数字、字符串、日期格式化用法介绍

    在用FreeMarker过程中,感觉FreeMarker的字符串,日期,集合等处理能力还是很强大的,上网搜了一些资料,整理如下,以便能帮助大家更熟练的应用Freemarker完成项目开发. 一.Seq ...

随机推荐

  1. 听说 Android 9.0 要禁用 @Hide Api 的调用,你怎么看?

    Android 9.0? Hi,大家好,我是承香墨影! 距离 Android 8.0 发布,已经过了五个月,虽然现在占有率并不高,不过呢,Google 已经着手准备下一版本的 Android 系统. ...

  2. 程序员是这样区分Null和Undefined

    Null类型 Null类型是第二个只有一个值的数据类型,这个特殊的值是null.从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值时会返回"obje ...

  3. bat判断当前目录是否是根目录

    记录下,一遍查用. @echo offif "%~p0"=="\" (echo 在根目录) else echo 不在根目录pause

  4. vue源码入口文件分析

    开发vue项目有段时间了, 之前用angularjs 后来用 reactjs 但是那时候一直没有时间把自己看源码的思考记录下来,现在我不想再浪费这 来之不易的思考, 我要坚持!! 看源码我个人感觉非常 ...

  5. linux 硬软链接区别

    linux 硬软链接区别 linux的软连接(symbolic link or soft link)类似于windows的快捷方式:而硬链接(hard link)机制有点像copy,不过不同的是,带有 ...

  6. vue中组件之间的相互调用,及通用后台管理系统左侧菜单树的迭代生成

    由于本人近期开始学习使用vue搭建一个后端管理系统的前端项目,在左侧生成菜单树的时候遇到了一些问题.在这里记录下 分析:由于本人设定的菜单可以使多级结构,直接使用vue的v-for 遍历并不是很方便. ...

  7. 利用10h号中断在dos中间显示自己名字

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  8. navicat的简单使用

    navicat的简单使用: 连接: 输入ip地址,端口,用户名,密码 新建数据库: 数据库名,字符编码一定要选择utf-8 新建表: 字段,约束条件 双击表名,自己打开表,点击空列,添加数据,ctl+ ...

  9. requests_模拟登录知乎

    如何登录知乎? 首先要分析,进行知乎验证的时候,知乎服务器需要我们提交什么数据,提交的地址.先进行几次登录尝试,通过浏览器中network中查看数据流得知,模拟登录知乎需要提供5个数据,分别是_xsr ...

  10. python_爬百度百科词条

    如何爬取? 明确目标:爬取百度百科,定初始百度词条:python,初始URL:http://baike.baidu.com/item/Python,爬取数据量为1000条,值爬取简介,标题,和简介中u ...