# 案例:创建一个简单的ElectricCar类版本,具备Car类的所有功能:classCar():'''一次模拟汽车的简单尝试'''def__init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading =0defget_descriptive_name(self):
long_name =str(self.year)+' '+ self.make +' '+ self.model
return long_name.title()defread_odometer(self):print("This car has "+str(self.odometer_reading)+" miles on it.")defupdate_odometer(self,mileage):if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:print("You can't roll back an odometer!")defincrement_odometer(self,miles):
self.odometer_reading += miles
classElectricCar(Car):'''电动汽车的独特之处'''def__init__(self,make,model,year):'''初始化父类的属性'''super().__init__(make,model,year)
my_tesla = ElectricCar('tesla','models',2016)print(my_tesla.get_descriptive_name())
# 案例:添加一个电动汽车特有的属性(电瓶),以及一个描述该属性的方法,我们将存储电瓶容量,并编写一个打印电瓶描述的方法:classCar():'''一次模拟汽车的简单尝试'''def__init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading =0defget_descriptive_name(self):
long_name =str(self.year)+' '+ self.make +' '+ self.model
return long_name.title()defread_odometer(self):print("This car has "+str(self.odometer_reading)+" miles on it.")defupdate_odometer(self,mileage):if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:print("You can't roll back an odometer!")defincrement_odometer(self,miles):
self.odometer_reading += miles
classElectricCar(Car):def__init__(self,make,model,year):'''
电动汽车的独特之处
初始化父类的属性,再初始化电动汽车特有的属性
'''super().__init__(make,model,year)
self.battery_size =70defdescribe_battery(self):'''打印一条描述电瓶容量的消息'''print("This car has a "+str(self.battery_size)+"-kwh battery.")
my_tesla = ElectricCar('tesla','model s',2016)print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
2016 Tesla Model S
This car has a 70-kwh battery.
重写父类的方法
对于父类的方法,只要它不符合子类模拟的事务的行为,都可对其进行重写
在子类中定义一个方法,即它与要重写的父类方法同名。so,Python将不会考虑这个父类的方法
# 案例:假设Car类有一个方法:fill_gas_tank()的方法,它对全东东骑车来书毫无意义,因此需要重写它defElectricCar(Car):--snip--deffill_gas_tank():""" 电动汽车没有油箱 """print("This car doesn't need a gas tank!")
# 案例:不断给ElectricCar类添加细节,将这些细节提取出来,放到另一个类中,并将新建的类实例用作ElectricCar类的一个属性classCar():'''一次模拟汽车的简单尝试'''def__init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading =0defget_descriptive_name(self):
long_name =str(self.year)+' '+ self.make +' '+ self.model
return long_name.title()defread_odometer(self):print("This car has "+str(self.odometer_reading)+" miles on it.")defupdate_odometer(self,mileage):if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:print("You can't roll back an odometer!")defincrement_odometer(self,miles):
self.odometer_reading += miles
classBattery():'''一次模拟电动汽车电瓶的简单尝试'''def__init__(self,battery_size=70):'''
初始化电瓶的属性
'''
self.battery_size = battery_size
defdescribe_battery(self):'''打印一条描述电瓶容量的消息'''print("This car has a "+str(self.battery_size)+"-kwh battery.")classElectricCar(Car):'''电动汽车的独特之处'''def__init__(self,make,model,year):'''初始化父类的属性,再初始化电动汽车特有的属性'''super().__init__(make,model,year)
self.battery = Battery()
my_tesla = ElectricCar('tesla','model s',2016)print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
2016 Tesla Model S
This car has a 70-kwh battery.
# 给Battery类添加一个方法,根据电瓶容量报告汽车的续航里程:classCar():'''一次模拟汽车的简单尝试'''def__init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading =0defget_descriptive_name(self):
long_name =str(self.year)+' '+ self.make +' '+ self.model
return long_name.title()defread_odometer(self):print("This car has "+str(self.odometer_reading)+" miles on it.")defupdate_odometer(self,mileage):if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:print("You can't roll back an odometer!")defincrement_odometer(self,miles):
self.odometer_reading += miles
classBattery():'''一次模拟电动汽车电瓶的简单尝试'''def__init__(self,battery_size=70):'''
初始化电瓶的属性
'''
self.battery_size = battery_size
defdescribe_battery(self):'''打印一条描述电瓶容量的消息'''print("This car has a "+str(self.battery_size)+"-kwh battery.")defget_range(self):'''打印一条消息,指出电瓶车的续航里程'''if self.battery_size ==70:range=240elif self.battery_size ==85:range=270
message ="This car can go approximately "+str(range)
message +=" milese on a full charge."print(message)classElectricCar(Car):def__init__(self,make,model,year):super().__init__(make,model,year)
self.battery = Battery()
my_tesla = ElectricCar('tesla','model s',2016)print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
2016 Tesla Model S
This car has a 70-kwh battery.
This car can go approximately 240 milese on a full charge.
# 4.电瓶升级# 给 Battery 类添加一个名为 upgrade_battery() 的方法。这个方法检查电瓶容量,如果它不是 85 ,就将它# 设置为 85 。创建一辆电瓶容量为默认值的电动汽车,调用方法 get_range() ,然后对电瓶进行升级,并再次调用 get_range() 。你会看到这辆汽车的续航里程增# 加了。classCar():"""A simple attempt to represent a car."""def__init__(self, manufacturer, model, year):"""Initialize attributes to describe a car."""
self.manufacturer = manufacturer
self.model = model
self.year = year
self.odometer_reading =0defget_descriptive_name(self):"""Return a neatly formatted descriptive name."""
long_name =str(self.year)+' '+ self.manufacturer +' '+ self.model
return long_name.title()defread_odometer(self):"""Print a statement showing the car's mileage."""print("This car has "+str(self.odometer_reading)+" miles on it.")defupdate_odometer(self, mileage):"""
Set the odometer reading to the given value.
Reject the change if it attempts to roll the odometer back.
"""if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:print("You can't roll back an odometer!")defincrement_odometer(self, miles):"""Add the given amount to the odometer reading."""
self.odometer_reading += miles
classBattery():"""A simple attempt to model a battery for an electric car."""def__init__(self, battery_size=60):"""Initialize the batteery's attributes."""
self.battery_size = battery_size
defdescribe_battery(self):"""Print a statement describing the battery size."""print("This car has a "+str(self.battery_size)+"-kWh battery.")defget_range(self):"""Print a statement about the range this battery provides."""if self.battery_size ==60:range=140elif self.battery_size ==85:range=185
message ="This car can go approximately "+str(range)
message +=" miles on a full charge."print(message)defupgrade_battery(self):"""Upgrade the battery if possible."""if self.battery_size ==60:
self.battery_size =85print("Upgraded the battery to 85 kWh.")else:print("The battery is already upgraded.")classElectricCar(Car):"""Models aspects of a car, specific to electric vehicles."""def__init__(self, manufacturer, model, year):"""
Initialize attributes of the parent class.
Then initialize attributes specific to an electric car.
"""super().__init__(manufacturer, model, year)
self.battery = Battery()print("Make an electric car, and check the battery:")
my_tesla = ElectricCar('tesla','model s',2016)
my_tesla.battery.describe_battery()print("\nUpgrade the battery, and check it again:")
my_tesla.battery.upgrade_battery()
my_tesla.battery.describe_battery()print("\nTry upgrading the battery a second time.")
my_tesla.battery.upgrade_battery()
my_tesla.battery.describe_battery()
Make an electric car, and check the battery:
This car has a 60-kWh battery.
Upgrade the battery, and check it again:
Upgraded the battery to 85 kWh.
This car has a 85-kWh battery.
Try upgrading the battery a second time.
The battery is already upgraded.
This car has a 85-kWh battery.