1、没有super之前,在子类里面需要父类里面的逻辑,但是我们是通过派生(自己定义了一个init,增加了一条line)

class vehichle:#定义一个交通工具的类
    Country="China"
    def __init__(self,name,speed,load,power):
        self.name=name
        self.speed=speed
        self.load=load
        self.power=power
    def run(self):
        print("开动啦")
class Subway(vehichle):#定义一个地铁,继承父类vehichle
    # pass#如果自己没有init,Subway会继承父类的init方法
    def __init__(self,name,speed,load,power,line):
        self.name=name
        self.speed=speed
        self.load=load
        self.power=power
        self.line=line
    def show_info(self):
        print(self.name,self.line)
line13=Subway("北京地铁","10km/s","10000人","电",13)#实例化一个line13
line13.show_info()#用实例调用类的属性,会自动把实例本身穿进去

C:\python35\python3.exe D:/pyproject/day25/在子类中调用父类.py

北京地铁 13

2、改进一下,在子类中调用父类的init方法

class vehichle:#定义一个交通工具的类
    Country="China"
    def __init__(self,name,speed,load,power):
        self.name=name
        self.speed=speed
        self.load=load
        self.power=power
    def run(self):
        print("开动啦")
class Subway(vehichle):#定义一个地铁,继承父类vehichle
    # pass#如果自己没有init,Subway会继承父类的init方法
    def __init__(self,name,speed,load,power,line):
        vehichle.__init__(self,name,speed,load,power)#调用父类的init方法
        self.line=line
    def show_info(self):
        print(self.name,self.speed,self.load,self.line)
line13=Subway("北京地铁","10km/s","10000人","电",13)#实例化一个line13
line13.show_info()#用实例调用类的属性,会自动把实例本身穿进去

C:\python35\python3.exe D:/pyproject/day25/在子类中调用父类.py

北京地铁 10km/s 10000人 13

3、在子类里面也调用一下父类的run方法

class vehichle:#定义一个交通工具的类
    Country="China"
    def __init__(self,name,speed,load,power):
        self.name=name
        self.speed=speed
        self.load=load
        self.power=power
    def run(self):
        print("开动啦")
        print("父类的开动啦")
class Subway(vehichle):#定义一个地铁,继承父类vehichle
    # pass#如果自己没有init,Subway会继承父类的init方法
    def __init__(self,name,speed,load,power,line):
        vehichle.__init__(self,name,speed,load,power)#调用父类的init方法
        self.line=line
    def show_info(self):
        print(self.name,self.speed,self.load,self.line)
    def run(self):
        vehichle.run(self)
        print("%s %s 开动啦" %(self.name,self.line))
line13=Subway("北京地铁","10km/s","10000人","电","13号线")#实例化一个line13
line13.show_info()#用实例调用类的属性,会自动把实例本身穿进去
line13.run()

C:\python35\python3.exe D:/pyproject/day25/在子类中调用父类.py

北京地铁 10km/s 10000人 13号线

开动啦

父类的开动啦

北京地铁 13号线 开动啦

4、super方法   调用父类的方法

super的方法的好处是,当你的父类的名字改变之后,只需要在Subway那里继承的名字改一下,就行,不用动下面的逻辑

第一种写法:

class vehichle:#定义一个交通工具的类
    Country="China"
    def __init__(self,name,speed,load,power):
        self.name=name
        self.speed=speed
        self.load=load
        self.power=power
    def run(self):
        print("开动啦")
        print("父类的开动啦")
class Subway(vehichle):#定义一个地铁,继承父类vehichle
    # pass#如果自己没有init,Subway会继承父类的init方法
    def __init__(self,name,speed,load,power,line):
        # vehichle.__init__(self,name,speed,load,power)#调用父类的init方法
        super().__init__(name,speed,load,power)#调用父类的init
        self.line=line
    def show_info(self):
        print(self.name,self.speed,self.load,self.line)
    def run(self):
        # vehichle.run(self)
        super().run()#调用父类的run
        print("%s %s 开动啦" %(self.name,self.line))
line13=Subway("北京地铁","10km/s","10000人","电","13号线")#实例化一个line13
line13.show_info()#用实例调用类的属性,会自动把实例本身穿进去
line13.run()

C:\python35\python3.exe D:/pyproject/day25/super方法的使用.py

北京地铁 10km/s 10000人 13号线

开动啦

父类的开动啦

北京地铁 13号线 开动啦

 

第二种写法:

super().__init__(name,speed,load,power)等价于

super(Subway,self).__init__(name,speed,load,power)

 

super().run()等价于

super(Subway,self).run()

 

我们记住上面的第一种就行了,有的人写第二种我们也要能看懂

class vehichle:#定义一个交通工具的类
    Country="China"
    def __init__(self,name,speed,load,power):
        self.name=name
        self.speed=speed
        self.load=load
        self.power=power
    def run(self):
        print("开动啦")
        print("父类的开动啦")
class Subway(vehichle):#定义一个地铁,继承父类vehichle
    # pass#如果自己没有init,Subway会继承父类的init方法
    def __init__(self,name,speed,load,power,line):
        # vehichle.__init__(self,name,speed,load,power)#调用父类的init方法
        # super().__init__(name,speed,load,power)#调用父类的init
        super(Subway,self).__init__(name,speed,load,power)#调用父类的init
        self.line=line
    def show_info(self):
        print(self.name,self.speed,self.load,self.line)
    def run(self):
        # vehichle.run(self)
        # super().run()#调用父类的run
        super(Subway,self).run()  # 调用父类的run
        print("%s %s 开动啦" %(self.name,self.line))
line13=Subway("北京地铁","10km/s","10000人","电","13号线")#实例化一个line13
line13.show_info()#用实例调用类的属性,会自动把实例本身穿进去
line13.run()

C:\python35\python3.exe D:/pyproject/day25/super方法的使用.py

北京地铁 10km/s 10000人 13号线

开动啦

父类的开动啦

北京地铁 13号线 开动啦