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继承的写法

最新文章

  1. kernel update 2.6.18-2.6.38
  2. cURL 学习笔记与总结(5)用 cURL 访问 HTTPS 资源
  3. wireshark抓包
  4. 使用Visual Studio 2013进行单元测试--初级篇
  5. iOS平台XML解析类库对比和安装说明
  6. NeHe OpenGL教程 第二十九课:Blt函数
  7. NBearV3中文教程总目录
  8. 【Android】ADB常用指令与logcat日志(转)
  9. Android(java)学习笔记132:ListViewProject案例(ListView + ArrayAdapter)
  10. Windows玩转Docker(二):运行whalesay image
  11. 【译】延迟加载JavaScript
  12. 201521123024 《Java程序设计》第2周学习总结
  13. SpringCloud应用入库后乱码问题
  14. Fork/Jion框架详解
  15. 浅议极大似然估计(MLE)背后的思想原理
  16. js url参数解析获取
  17. JQ01
  18. 模拟器 Unable to execute simctl install Error 117
  19. Bootstrap3.0学习第四轮(排版)
  20. Codeforces 901C Bipartite Segments

热门文章

  1. 后台框架 FastAdmin V1.0.0.20200228 发布,为疫情防控作贡献
  2. Mybatis笔记一
  3. Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
  4. Servlet+Spring+Mybatis初试
  5. 夯实Java基础(二十一)——Java反射机制
  6. Spring Cloud Hystrix 请求熔断与服务降级
  7. VMware 设置共享文件夹
  8. RF之变量的共享使用与python测试库-5
  9. 页面自动执行js的3种方法
  10. 修改gho打造个性ghostxp光盘