学习笔记--Python 子类继承父类

    技术2022-07-10  153

    主要是参考菜鸟教程中的相关代码,代码连接[在这里](https://www.runoob.com/w3cnote/python-extends-init.html)

    如果在子类中需要父类的构造方法就需要***显式***地调用父类的构造方法,或者不重写父类的构造方法。子类不重写 init,实例化子类时,会自动调用父类定义的 init。

    class Father(object): def __init__(self, name): self.name=name print ( "name: %s" %( self.name) ) def getName(self): return 'Father ' + self.name class Son(Father): def getName(self): return 'Son '+self.name if __name__=='__main__': son=Son('runoob') print ( son.getName() )

    输出结果为:

    name: runoob Son runoob

    Son类(子类)继承了父类Father,而Son没有重写__init__函数,由于继承了父类,故在实例化时会自动的调用父类的__init__方法,虽然Son并没有指定参数变量。上述代码执行顺序为:son=Son(‘runoob’),先初始化调用父类的__init__函数,故输出self.name,然后执行print ( son.getName() ),输出’Son '+self.name。

    如果重写了__init__ 时,实例化子类,就不会调用父类已经定义的 init

    class Father(object): def __init__(self, name): self.name=name print ( "name: %s" %( self.name) ) def getName(self): return 'Father ' + self.name class Son(Father): def __init__(self, name): print ( "hi" ) self.name = name def getName(self): return 'Son '+self.name if __name__=='__main__': son=Son('runoob') print ( son.getName() )

    输出结果为:

    hi Son runoob

    这里子类Son继承了父类Father,与上面代码不同之处在于,这里的Son重写了__init__方法,因此在实例化Son时( son=Son(‘runoob’)),不会调用父类的__init__方法,故父类中 print ( “name: %s” %( self.name) )不会执行,而只会执行 Son类中的__init__函数,故输出:hi,然后执行getName函数,输出 'Son '+self.name

    如果重写了__init__ 时,要继承父类的构造方法,可以使用 super 关键字

    super(子类,self).__init__(参数1,参数2....)

    代码如下:

    class Father(object): def __init__(self, name): self.name=name print ( "name: %s" %( self.name)) def getName(self): return 'Father ' + self.name class Son(Father): def __init__(self, name): super(Son, self).__init__(name) print ("hi") self.name = name def getName(self): return 'Son '+self.name if __name__=='__main__': son=Son('runoob') print ( son.getName() )

    输出结果为:

    name: runoob hi Son runoob

    子类Son继承了父类Father,并且重写了__init__方法,故Son可以继承父类的__init__方法,因此在实例化时(son=Son(‘runoob’)),先访问父类__init__方法,然后继续执行自己的__init__方法(注意这里super是在 print (“hi”)语句之前的,因此是先执行super,再执行print (“hi”)语句,按顺序执行,如过改成supen在print (“hi”)下面那么输出结果就会是:

    hi name: runoob Son runoob
    Processed: 0.046, SQL: 9