今天我们主要来介绍“继承”,这是类的一个很重要的功能。
什么是继承呢?就是说当你定义了一个类后,如果我希望有一个新的类,可以拥有之前类的所有属性和方法,同时也能创建自己的属性和方法。
此时,这个新的类就叫做子类,之前的类就叫做父类,将父类的属性和方法“复制”到子类中的这个动作就叫做继承。也就是说,子类既有和父类的“共性”,又有自己的“个性”。
1
多说无益,我们先来看一个例子:
class Bike:
def __init__(self,model,year):
self.model = model
self.year = year
self.distance = 0
def dis(self):
print(f'The {self.model} has {self.distance} km on it.')
def update_dis(self,km):
if km >= self.distance:
self.distance = km
else:
print("Wrong behavior!")
class Mountain_bike(Bike):
def __init__(self,model,year):
super().__init__(model,year)
在这段代码中,我们先定义了一个父类Bike,然后又定义了一个子类Mountain_bike,希望能继承父类。因此,在子类后要加一个括号,里面写上父类的名字。这里我们的父类是自行车,而子类是山地车,山地车是自行车的一种。
之后,定义调用子类时自动运行的方法__init__,因为我们想继承父类,所以super()就表示继承的含义,它表示调用父类的方法。super是superclass(超类)的简写,因此父类又被称为超类。
我们希望继承父类的属性,因此后面要跟__init__方法,但里面的参数就不用写self了,这里只表示继承关系。
将子类实例化后,它就可以调用父类的属性和方法了,比如:
new_bike = Mountain_bike('XC',2021)
new_bike.dis()
输出结果为:
The XC has 0 km on it.
2
当然,子类也可以拥有自己的属性和方法,让我们给之前的Mountain_bike添加一些吧:
class Mountain_bike(Bike):
def __init__(self,model,year):
super().__init__(model,year)
self.transmission = 27
def speed_changer(self):
print(f"The {self.model} has {self.transmission} shifting.")
注意第4行代码,我们给子类添加了一个transmission的属性,它表示山地车的速别,这里默认是27速。
然后又添加了一个speed_changer的方法,打印当前型号山地车的速别。
我们将其实例化,调用子类的新方法看下:
new_bike = Mountain_bike('XC',2021)
new_bike.speed_changer()
The XC has 27 shifting.
3
有时候父类的方法可能过时了,不再适合所有子类,这时你可以在子类中重写父类的方法。
具体的操作是,在子类中定义一个和父类方法完全相同的名字,然后写入新的内容:
class Mountain_bike(Bike):
def __init__(self,model,year):
super().__init__(model,year)
self.transmission = 27
def speed_changer(self):
print(f"The {self.model} has {self.transmission} shifting.")
def update_dis(self): #和父类方法同名
print('You can not do this!')
注意第7行,当你定义了一个和父类完全相同的方法时,在子类实例化之后,如果调用该方法,那么将使用子类中的定义,而覆盖掉原先父类中的定义。我们将其实例化,看下结果:
new_bike = Mountain_bike('XC',2021)
new_bike.update_dis()
You can not do this!
4
有时候你会发现有些子类的方法是类似,你可以把它们提取出来,作为一个新的类。同时,新类的实例也可以作为属性应用到原来的类中。
比如山地车都有速别这个属性,那么我可以将其单独创建一个类:
class Transmission:
def __init__(self,transmission = 27):
self.transmission = transmission
def speed_changer(self):
print(f"The bike has {self.transmission} shifting.")
我可以在山地车这个类中,将Transmission实例化,作为其属性:
class Mountain_bike(Bike):
def __init__(self,model,year):
super().__init__(model,year)
self.trans = Transmission() #实例用作属性
注意第4行代码,新类被实例化,赋给了属性trans,这意味着该属性可以调用Transmission类中的所有属性和方法。比如下面这样:
new_bike = Mountain_bike('XC',2021)
new_bike.trans.speed_changer()
看下结果:
The bike has 27 shifting.
关于类的内容,终于介绍完了,你都get到了吗?
转载请注明:XAMPP中文组官网 » 零基础学Python继承——子承父类