• 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().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继承的写法

  • 相关阅读:
    CentOS 7.X 关闭SELinux
    删除或重命名文件夹和文件的方法
    centos7-每天定时备份 mysql数据库
    centos7 tar.gz zip 解压命令
    MySQL5.6/5.7/8.0版本授权用户远程连接
    下载CentOS7系统
    使用js实现tab页签切换效果
    sql优化常用的几种方法
    mysql 多表联查的快速查询(索引)
    【图论】强连通分量+tarjan算法
  • 原文地址:https://www.cnblogs.com/kongk/p/8644745.html
Copyright © 2020-2023  润新知