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继承的写法
最新文章
- kernel update 2.6.18-2.6.38
- cURL 学习笔记与总结(5)用 cURL 访问 HTTPS 资源
- wireshark抓包
- 使用Visual Studio 2013进行单元测试--初级篇
- iOS平台XML解析类库对比和安装说明
- NeHe OpenGL教程 第二十九课:Blt函数
- NBearV3中文教程总目录
- 【Android】ADB常用指令与logcat日志(转)
- Android(java)学习笔记132:ListViewProject案例(ListView + ArrayAdapter)
- Windows玩转Docker(二):运行whalesay image
- 【译】延迟加载JavaScript
- 201521123024 《Java程序设计》第2周学习总结
- SpringCloud应用入库后乱码问题
- Fork/Jion框架详解
- 浅议极大似然估计(MLE)背后的思想原理
- js url参数解析获取
- JQ01
- 模拟器 Unable to execute simctl install Error 117
- Bootstrap3.0学习第四轮(排版)
- Codeforces 901C Bipartite Segments
热门文章
- 后台框架 FastAdmin V1.0.0.20200228 发布,为疫情防控作贡献
- Mybatis笔记一
- Vue——解决报错 Computed property ";****"; was assigned to but it has no setter.
- Servlet+Spring+Mybatis初试
- 夯实Java基础(二十一)——Java反射机制
- Spring Cloud Hystrix 请求熔断与服务降级
- VMware 设置共享文件夹
- RF之变量的共享使用与python测试库-5
- 页面自动执行js的3种方法
- 修改gho打造个性ghostxp光盘