python的super()以及父类继承
Python中子类调用父类的方法有两种方法能够实现:调用父类构造方法,或者使用super函数(两者不要混用)。
使用“super”时经常会出现代码“super(FooChild,self).__init__(xxx,xxx)”。那super().__init__()到底要怎么用呢?
为了方便理解,我写了如下例子验证用法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#-*- coding:utf-8 -*-<br>class A(object): def __init__( self ,xing,gender): #!#1 self .namea = "aaa" #!#2 self .xing = xing #!#3 self .gender = gender #!#4 def funca( self ): print "function a : %s" % self .namea class B(A): def __init__( self ,xing,age): #!#5 super (B, self ).__init__(xing,age) #!#6(age处应为gender) self .nameb = "bbb" #!#7 ##self.namea="ccc" #!#8 ##self.xing = xing.upper() #!#9 self .age = age #!#10 def funcb( self ): print "function b : %s" % self .nameb b = B( "lin" , 22 ) #!#11 print b.nameb print b.namea print b.xing #!#12 print b.age #!#13 b.funcb() b.funca() |
通过更改代码中标记#!#几行的输入参数来验证super的用法,并得出以下结论:
1.B类继承A类,在B类自己的基础上可以调用A类所以的方法,代码最后两行b.funcb()\b.funca()可以正常运行。
2.A、B同时拥有__init__,B会改写A中的__init__方法,A类的方法失效,通过注释(#)掉#!#6行代码、恢复#89行代码,运行后可得。
3.super函数可以调用A父类中的属性,如namea、xing,B类中有同名属性时,覆盖A类中的同名属性。但调用函数时总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。
4.B类__init__(#5)参数需大于或等于A父类的__init__方法,因为super初始化了,参数量为父类参数量。
5.super函数原理:super().__init__(xxx,xxx)中的xxx参数为类B(#5)中输入的参数,但与类A中参数名相对应。如上面那段代码#6中输入的是age参数,虽然运行结果并没错(因为没有运行.gender),但是其实这个age参数是赋值到A类的gender参数上的(本文末的第二段代码有相关例子,代码加#####处)
6.使用super函数时,可将B子类中(#5)与A类相同的参数依次写入__init__(xxx)的xxx参数中(注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出,也不能写),之后可再次重写xxx中参数属性,#5中多余参数可自定义属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
class A( object ): def __init__( self ,xing,gender): self .namea = "aaa" self .xing = xing self .gender = gender def funca( self ): print "function a : %s" % self .namea class B(A): def __init__( self ,xing,gender,age): super (B, self ).__init__(xing,age) self .nameb = "bbb" ##self.namea="ccc" self .xing = xing.upper() self .age = age + 1 #self.gender = gender.upper() def funcb( self ): print "function b : %s" % self .nameb b = B( "lin" , "nan" , 22 ) print b.nameb print b.namea print b.xing print b.age b.funcb() b.funca() print b.gender ##### |
输出结果:
bbb aaa LIN 23 function b : bbb function a : aaa 22 #####
关于Python中的类普通继承与super函数继承
1.super只能用于新式类
2.多重继承super可以保公共父类仅被执行一次
一.首先看下普通继承的写法
二.再看看super继承的写法
python的super()以及父类继承的更多相关文章
- python使用super()调用父类的方法
如果要在子类中引用父类的方法,但是又需要添加一些子类所特有的内容,可通过类名.方法()和super()来调用父类的方法,再个性化子类的对应函数. 直接使用类名.方法()来调用时,还是需要传入self为 ...
- Python 关于super在多继承中的解析
一.单继承情况: 解析: 创建B类的实例化对象时,执行初始化函数: 打印输出Enter B,当遇到super()调用父类初始化函数(此时是调用B类的父类A的__init__函数),输出Enter A. ...
- 关于Python中的类普通继承与super函数继承
关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...
- Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)
Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: 将一些东西封装到一个地方,你还可以取出来( ...
- 第7.22节 Python中使用super调用父类的方法
第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...
- [面向对象之继承应用(在子类派生重用父类功能(super),继承实现原理(继承顺序、菱形问题、继承原理、Mixins机制),组合]
[面向对象之继承应用(在子类派生重用父类功能(super),继承实现原理(继承顺序.菱形问题.继承原理.Mixins机制),组合] 继承应用 类与类之间的继承指的是什么'是'什么的关系(比如人类,猪类 ...
- 028.Python面向对象继承(单继承,多继承,super,菱形继承)
一 继承的概念 种类 单继承 多继承 至少两个类: 子类:一个类继承另外一个类,那么该类是子类(也叫作衍生类) 父类:另外一个,这个被继承的类,叫做父类(也叫作超类),object 在python中 ...
- 由Python的super()函数想到的
python-super *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !im ...
- python学习第十六天 --继承进阶篇
这一章节主要讲解面向对象高级编程->继承进阶篇,包括类多继承介绍和继承经典类和新式类属性的查找顺序不同之处. 多继承 上一章节我们讲到继承,子类继承父类,可以拥有父类的属性和方法,也可以进行扩展 ...
随机推荐
- ShellCode模板
前言 在上一篇文章上使用到的添加用户的shellcode是怎么得到的呢? 先来拆分一下汇编的功能 ;寻找kernel32.dll的基地址 xor ecx,ecx mov eax,dword ptr f ...
- 一文解读IBMS (转)
IBMS系统是面向建筑设备生命周期的管理:面向楼宇的管理者和使用者:是传统BAS系统数据及功能的聚合. 更高效的分析和管理.更复杂的应用:跨平台.跨品牌的整合各子系统数据提供一套采集楼宇设备实时数据的 ...
- Thread的join方法
一个线程在执行的过程中,可能调用另一个线程,前者可以称为调用线程,后者成为被调用线程. Thread.Join方法的使用场景:调用线程挂起,等待被调用线程执行完毕后,继续执行. 如下案列: 当NewT ...
- 2020.02.28 Linux 命令
Cat 语法格式 cat [-AbeEnstTuv] [--help] [--version] fileName 参数说明: -n 或 --number:由 1 开始对所有输出的行数编号. -b ...
- 在IDEA中为SpringBoot配置热部署
版本:IDEA Community 2019.2.2,Spring Boot 2.1.8.RELEASE 流程:pom文件中添加依赖: <dependency> <groupId& ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:强调
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- postman 使用post方式提交参数值
参考:https://www.cnblogs.com/haoxuanchen2014/p/7771459.html
- ApacheDbUtilsTest
ApacheDbUtilsTest package p1; import com.DataSourceUtil; import entity.Student; import org.apache.co ...
- 【PAT甲级】1009 Product of Polynomials (25 分)
题意: 给出两个多项式,计算两个多项式的积,并以指数从大到小输出多项式的指数个数,指数和系数. trick: 这道题数据未知,导致测试的时候发现不了问题所在. 用set统计非零项时,通过set.siz ...
- 「Luogu P1383 高级打字机」
一道非常基础的可持久化数据结构题. 前置芝士 可持久化线段树:实现的方法主要是主席树. 具体做法 这个基本就是一个模板题了,记录一下每一个版本的字符串的长度,在修改的时候就只要在上一个版本后面加上一个 ...