继承
什么是继承?
编写类时,并非总要从空白开始。如果要编写的类是另一个现成类的特殊版本,可使用继承。
一个类继承另一个类时,将自动获得另一个类的所有属性和方法。现有的类称为父类,而新类称为子类。
子类继承了其父类的所有属性和方法,同时也可以定义自己的属性和方法。
1、子类的方法__init__
创建子类时,首先要完成的是将父类的所有属性和方法继承,这里使用子类的方法 __init__();
#继承
#子类的方法__init__()
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name.title()
def read_odometer(self):
print("This car has" + str(self.odometer_reading) + "mile on it.")
def update_odomter(self,mileage):
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an odometer!")
def increment_odometer(self,miles):
self.odometer_reading += miles
class ElectricCar(Car):
"""电动汽车的独特"""
def __init__(self,make,model,year):
"""初始化父类的属性"""
super().__init__(make,model,year)
my_tesla = ElectricCar('tesla','model X',2018)
print(my_tesla.get_descriptive_name())
执行结果:
1 2018 Tesla Model X
注意点:
创建子类时,父类必须包含在当前文件中,且位于子类前面。
super()是一个特殊函数,帮助父类和子类关联起来。
父类也称为超类(superclass)
1.1、给子类定义属性和方法
在一个类继承另一类后,可添加区分子类和父类所需的新属性和方法。
1 classCar():2 """一次模拟汽车的简单尝试"""
3 def __init__(self,make,model,year):4 self.make =make5 self.model =model6 self.year =year7 self.odometer_reading =08
9 defget_descriptive_name(self):10 long_name = str(self.year) + " " + self.make + " " +self.model11 returnlong_name.title()12
13 defread_odometer(self):14 print("This car has" + str(self.odometer_reading) + "mile on it.")15
16 defupdate_odomter(self,mileage):17 if mileage >=self.odometer_reading:18 self.odometer_reading =mileage19
20 else:21 print("You can't roll back an odometer!")22
23 defincrement_odometer(self,miles):24 self.odometer_reading +=miles25
26 classElectricCar(Car):27 """电动汽车的独特"""
28
29 def __init__(self,make,model,year):30 """初始化父类的属性"""
31 super().__init__(make,model,year)32
33 #给子类定义属性和方法
34 self.battery_size = 70
35
36 #给子类定义属性和方法
37 defdescribe_battery(self):38 """打印一条描述电瓶容量的消息"""
39 print("This car has a" + str(self.battery_size) + "-KWh battery.")40
41 my_tesla = ElectricCar('tesla','model X',2018)42 print(my_tesla.get_descriptive_name())43 my_tesla.describe_battery()
View Code
执行结果:
1 2018Tesla Model X2 This car has a 70-KWh battery.
1.2、重写父类的方法
如果父类中存在的一个方法完全不适用于子类,那么可以直接在子类中对父类的方法进行重写。
要求子类中重写的方法要与父类的同名,这样代码就不会执行父类方法,而只关注子类的方法
1 classCar():2 --snip--
3
4 deffill_gas_tank():5 """油箱"""
6 print("This car need a gas tank.")7
8 classElectricCar(Car):9 --snip--
10 #重写父类的方法
11 deffill_gas_tank():12 """电动汽车没有油箱"""
13 print("This car doesn't need a gas tank.")
1.3、将实例用作属性
定义一个新类,并且没有任何继承
在子类中,添加一个属性,指向新建的父类;这里是self.battery = Battery()
1 classCar():2 """一次模拟汽车的简单尝试"""
3 def __init__(self,make,model,year):4 self.make =make5 self.model =model6 self.year =year7 self.odometer_reading =08
9 defget_descriptive_name(self):10 long_name = str(self.year) + " " + self.make + " " +self.model11 returnlong_name.title()12
13 defread_odometer(self):14 print("This car has" + str(self.odometer_reading) + "mile on it.")15
16 defupdate_odomter(self,mileage):17 if mileage >=self.odometer_reading:18 self.odometer_reading =mileage19
20 else:21 print("You can't roll back an odometer!")22
23 defincrement_odometer(self,miles):24 self.odometer_reading +=miles25
26
27 #将实例用作属性
28 classBattery():29 def __init__(self, battery_size=70):30 """初始化电瓶的属性"""
31 self.battery_size =battery_size32
33 defdescribe_battery(self):34 """打印一条描述电瓶容量的信息"""
35 print("This car has a" + str(self.battery_size) + "-KWh battery.")36
37
38 classElectricCar(Car):39 """电动汽车的独特"""
40
41 def __init__(self,make,model,year):42 """初始化父类的属性"""
43 super().__init__(make,model,year)44
45 #给子类定义属性和方法
46 #self.battery_size = 70 #新属性
47 #初始化父类的属性,再初始化电动车特有的属性
48 self.battery =Battery()49
50 ##给子类定义属性和方法
51 #def describe_battery(self):
52 #"""打印一条描述电瓶容量的消息"""
53 #print("This car has a " + str(self.battery_size) + "-KWh battery.")
54
55 #重写父类的方法
56 deffill_gas_tank():57 """电动汽车没有油箱"""
58 print("This car doesn't need a gas tank.")59
60
61 my_tesla = ElectricCar('tesla','model X',2018)62 print(my_tesla.get_descriptive_name())63 #my_tesla.describe_battery()
64 my_tesla.battery.describe_battery()
执行结果:
1 2018Tesla Model X2 This car has a70-KWh battery.
继续将实例用作属性
classCar():--snip--#将实例用作属性
classBattery():
--snip--#实例2#打印一条消息,指出电瓶的续航里程
defget_range(self):if self.battery_size == 70:
range= 240
elif self.battery_size == 85:
range= 70msg= "This car can go approximately" +str(range)
msg+= "miles on a full charge."
print(msg)classElectricCar(Car):--snip--
trmy_tesla= ElectricCar('tesla','model X',2018)print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
执行结果:
1 2018Tesla Model X2 This car has a70-KWh battery.3 This car can go approximately240miles on a full charge.