一:代码文件结构
二:各个文件的具体代码
car.py代码如下:
class Car:
#prperties,read odometer,update odomeger,increment odometer
def __init__(self,brand,level,year):
self.brand = brand
self.level = level
self.year = year
self.odometer = 0
def describe_information(self):
print(f"this {self.level} car is made by {self.brand} in {self.year}" )
def read_odometer(self):
print(f"this car has drived {self.odometer} kilometers!")
def update_odometer(self,odometer_new):
if odometer_new >= self.odometer:
self.odometer = odometer_new
else:
print("there is a logical bug!")
def increment_odometer(self,mile):
self.odometer += mile
electric.py代码如下:
from car import Car
#init_battery_size, describe battery, get range
class Battery:
def __init__(self,battery_size = 50):
self.dc_size = battery_size
def describe_size(self):
print(f"the size of battery is {self.dc_size}")
def get_range(self):
if self.dc_size == 40:
#赋值符号和等号不能搞混淆
range = 150
elif self.dc_size == 50:
range = 190
print(f"this battery is able to provide ability about {range} KM")
class Electric_car(Car):
def __init__(self, brand, level, year):
super().__init__(brand, level, year)
#如果子类不覆盖超类的同名方法,那么实例化之后调用可以体现继承
#如果子类覆盖超类的同名方法,那么体现不同子类在相同名称的超类函数的不同表现可以称为多态
def describe_information(self):
print(f"$$$$$here is an electric car,infomation:{self.brand},{self.level},{self.year}")
self.battery = Battery(50)
my_cars.py代码如下:
from car import Car
from electric_car import Electric_car
my_car = Car('Audi','C',2023)
my_car.describe_information()
my_electric_car = Electric_car('TSLA','B','2025')
my_electric_car.describe_information()
my_electric_car.battery.describe_size()
my_electric_car.battery.get_range()
运行结果:
三:封装、继承、多态、组合如何体现
【封装】
将数据和行为封装在类中:Battery 类封装了电池的容量(dc_size)和相关行为(describe_size、get_range)。
Electric_car 类封装了电动汽车的品牌(brand)、型号(level)、年份(year)以及与电池相关的行为。
通过方法控制对数据的访问:Battery 类的 describe_size 和 get_range 方法提供了访问和操作电池容量的方式,而不是直接暴露 dc_size 属性。
Electric_car 类的 describe_information 方法提供了访问电动汽车信息的方式。
隐藏内部实现细节:Battery 类的 get_range 方法根据 dc_size 计算续航里程,但具体的计算逻辑被封装在方法内部,外部无法直接访问。
Electric_car 类通过 self.battery = Battery(50) 创建并管理电池对象,但具体的创建和初始化过程被封装在 __init__ 方法中。
提高代码的可维护性和复用性:封装使得每个类都具有清晰的职责,修改一个类的内部实现不会影响其他类。
Battery 类可以被其他需要电池功能的类复用。
继承、多态、组合在class Electric_car(Car)的代码中均可体
class Electric_car(Car)中,直接实例化Battery类以构成完整的Electric_car类,体现了组合
四:注意事项
1)尤其注意缩进格式,也就是会影响代码的作用域