PYTHON的SUPER()以及父类继承

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值