# <editor-fold desc="父類和子類關系,繼承">
# <editor-fold desc="類--講解--Car">
class Car():
def __init__(self,make,model,year):
self.make=make
self.model=model
self.year =year
self.meter=0
def get_car_desc(self):
long_name=str(self.year)+' '+self.model+' '+self.make
return long_name
def read_meter(self): #讀取公里數的方法
print("This car have "+str(self.meter)+" mi")
def update_meter(self,mileage): #定義了一個修改公里數的方法,以后要修改公里數的時候,就不需要通過實例化修改屬性的值了
self.meter=mileage
def increment_meter(self,miles): #新增加的公里數,做加法運算
self.meter+=miles
my_car=Car('china','Audi',2010)
# print(my_car.model)
# print(my_car.get_car_desc().title())
# my_car.read_meter()
# my_car.meter=50 #通過實例化對屬性的值做改變
# my_car.read_meter()
# my_car.update_meter(100)
# my_car.read_meter()
# my_car.increment_meter(200)
# my_car.read_meter()
# </editor-fold>
class Battery():
def __init__(self,battery_size=70):
self.battery_size=battery_size
def describe_battery(self):
print('這個車有'+str(self.battery_size)+'的電容量')
def get_range(self):
if self.battery_size==70:
car_range=240
elif self.battery_size <=100 and self.battery_size>=75:
car_range=270
msg="這個車能跑%s公里"%car_range
return msg
class ElectricCar(Car): #創造ElectricCar(電動汽車)類
def __init__(self,make,model,year):
super().__init__(make,model,year)
self.battery=Battery()
def describe_battery(self):
print("電動汽車特有的屬性是%s"%self.battery.battery_size)
def read_meter(self): #父類當中的一個方法,對子類沒有幫助,在子類當中,定義一個父類當中同名字的方法名,那么就會忽略父類的方法,取其精華。(重寫父類的方法)
print("這個方法是重寫父類的方法,會忽略父類當中的read_meter()方法")
my_ele_car=ElectricCar("usa",'baoma',2020)
# print(my_ele_car.get_car_desc())
# my_ele_car.read_meter()
# my_ele_car.describe_battery()
my_ele_car.battery.describe_battery()
# print(my_ele_car.battery.battery_size)
print(my_ele_car.battery.get_range())
# """
# super()是一個特殊的函數,它讓父類和子類可以關聯起來。這段代碼讓python調用ElectricCar的父類方法__init__(),讓ElectricCar實例包含父類的所有屬性。Python中類的初始化方法是__init__(),因此父類、子類的初始化方法都是這個,如果子類不實現__init__()這個函數,初始化時調用父類的初始化函數,如果子類實現了這個函數,則要在這個函數里顯式調用一下父類的__init__(),這跟C++,jAVA不一樣,他們是自動調用父類構造函數的。
# """
# </editor-fold>