Ch 9類
本文是《Python從入門到實踐》的學習筆記,之後還會繼續更新,所有程式碼均在Jupyter Notebook上執行沒有問題,可直接複製貼上,歡迎討論python學習方法,之後還會繼續更新python的學習筆記
9。1 建立和使用類
9。1。1 建立dog類
注意init是左右兩邊各兩條橫線,這是每個類中必有的函式
class Dog():
def _init_(self,name,age):
“”“初始化屬性name和age”“”
self。name=name
self。age=age
def sit(self):
“”“模擬小狗被命令時蹲下”“”
print(self。name。title()+“ is now sitting。”)
def roll_over(self):
“”“模擬小狗被命令時打滾”“”
print(self。name。title()+“ rolled over!”)
9。1。2根據類建立例項
1。訪問屬性
#建立一個表示小狗的類Dog
#包含名字,年齡+動作蹲下+動作打滾
##建立Dog()例項時,透過實參向Dog()傳遞名字和年齡,self會自動傳遞
class Dog():
def __init__(self,name,age):
“”“初始化屬性name和age”“”
self。name=name
self。age=age
def sit(self):
“”“模擬小狗被命令時蹲下”“”
print(self。name。title()+“ is now sitting。”)
def roll_over(self):
“”“模擬小狗被命令時打滾”“”
print(self。name。title()+“ rolled over!”)
my_dog=Dog(‘kelly’,6)
print(“My dog‘s name is ”+my_dog。name。title()+“ 。”)
print(“My dog is ”+str(my_dog。age)+“ years old。”)
2。呼叫方法
#建立一個表示小狗的類Dog
#包含名字,年齡+動作蹲下+動作打滾
##建立Dog()例項時,透過實參向Dog()傳遞名字和年齡,self會自動傳遞
class Dog():
def __init__(self,name,age):
“”“初始化屬性name和age”“”
self。name=name
self。age=age
def sit(self):
“”“模擬小狗被命令時蹲下”“”
print(self。name。title()+“ is now sitting。”)
def roll_over(self):
“”“模擬小狗被命令時打滾”“”
print(self。name。title()+“ rolled over!”)
my_dog=Dog(’kelly‘,6)
print(“My dog’s name is ”+my_dog。name。title()+“ 。”)
print(“My dog is ”+str(my_dog。age)+“ years old。”)
my_dog。sit()
my_dog。roll_over()
3。建立多個例項
#建立一個表示小狗的類Dog
#包含名字,年齡+動作蹲下+動作打滾
##建立Dog()例項時,透過實參向Dog()傳遞名字和年齡,self會自動傳遞
class Dog():
def __init__(self,name,age):
“”“初始化屬性name和age”“”
self。name=name
self。age=age
def sit(self):
“”“模擬小狗被命令時蹲下”“”
print(self。name。title()+“ is now sitting。”)
def roll_over(self):
“”“模擬小狗被命令時打滾”“”
print(self。name。title()+“ rolled over!”)
my_dog=Dog(‘kelly’,6)
your_dog=Dog(‘lucy’,3)
print(“My dog‘s name is ”+my_dog。name。title()+“ 。”)
print(“My dog is ”+str(my_dog。age)+“ years old。”)
my_dog。sit()
my_dog。roll_over()
print(“\nYour dog’s name is ”+your_dog。name。title()+“ 。”)
print(“Your dog is ”+str(your_dog。age)+“ years old。”)
your_dog。sit()
your_dog。roll_over()
9。2 使用類與例項
9。2。1 Car類
class Car():
“”“一次模擬汽車的簡單嘗試”“”
def __init__(self,make,model,year):
“”“初始化描述汽車的屬性”“”
self。make=make
self。model=model
self。year=year
def get_descriptive_name(self):
“”“返回整潔的描述性資訊”“”
long_name=str(self。year)+“ ”+self。make+“ ”+self。model
return long_name。title()
my_new_car=Car(‘audi’,‘a4’,2016)
print(my_new_car。get_descriptive_name())
9。2。2 給屬性設定預設值
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。”)
my_new_car=Car(‘audi’,‘a4’,2016)
print(my_new_car。get_descriptive_name())
my_new_car。read_odometer()
9。2。3 修改屬性的值
1。直接修改屬性的值
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。”)
my_new_car=Car(‘audi’,‘a4’,2016)
print(my_new_car。get_descriptive_name())
my_new_car。odometer_reading=23
my_new_car。read_odometer()
2。 透過方法修改屬性的值
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_odometer(self,mileage):
“”“將里程錶讀數設定為指定的值”“”
self。odometer_reading=mileage
my_new_car=Car(‘audi’,‘a4’,2016)
print(my_new_car。get_descriptive_name())
my_new_car。update_odometer(23)
my_new_car。read_odometer()
也可對里程賦值函式進行擴充套件
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_odometer(self,mileage):
“”“將里程錶讀數設定為指定的值”“”
if mileage>=self。odometer_reading:
self。odometer_reading=mileage
else:
print(“你不能輸入比原來里程還小的值”)
my_new_car=Car(‘audi’,‘a4’,2016)
print(my_new_car。get_descriptive_name())
while True:
odometer=input(“輸入新的里程:”)
my_new_car。update_odometer(int(odometer))
my_new_car。read_odometer()
3。透過方法對屬性的值進行修改
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_odometer(self,mileage):
“”“將里程錶讀數設定為指定的值”“”
if mileage>=self。odometer_reading:
self。odometer_reading=mileage
else:
print(“你不能輸入比原來里程還小的值”)
def increment_odometer(self,miles):
“”“將里程錶讀數增加設定的量”“”
self。odometer_reading+=miles
my_new_car=Car(‘audi’,‘a4’,2016)
print(my_new_car。get_descriptive_name())
odometer=input(“輸入最初的里程:”)
my_new_car。update_odometer(int(odometer))
my_new_car。read_odometer()
while True:
print(“\nEnter ‘e’ to exit”)
in_odometer=input(“輸入增加的里程:”)
if in_odometer==‘e’:
break
else:
my_new_car。increment_odometer(int(in_odometer))
my_new_car。read_odometer()
9。3 繼承
9。3。1 子類的方法init()
子類繼承了父類的所有屬性和方法,同時還可以定義自己的屬性和方法
子類的方法init需要父類施以援手,在呼叫子類的init()需要先初始化父類的屬性
super()是呼叫父類的函式
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_odometer(self,mileage):
“”“將里程錶讀數設定為指定的值”“”
if mileage>=self。odometer_reading:
self。odometer_reading=mileage
else:
print(“你不能輸入比原來里程還小的值”)
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 s’,2016)
print(my_tesla。get_descriptive_name())
9。3。3 給子類定義屬性和方法
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_odometer(self,mileage):
“”“將里程錶讀數設定為指定的值”“”
if mileage>=self。odometer_reading:
self。odometer_reading=mileage
else:
print(“你不能輸入比原來里程還小的值”)
def increment_odometer(self,miles):
“”“將里程錶讀數增加設定的量”“”
self。odometer_reading+=miles
class ElectricCar(Car):
“”“
電動汽車的獨特之處
初始化父類的屬性,再初始化電動汽車的特有的屬性
”“”
def __init__(self,make,model,year):
“”“初始化父類屬性”“”
super()。__init__(make,model,year)
self。battery_size=70
def describe_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()
9。3。5 將例項用作屬性
可以將原來的一個屬性進行拓展進行深入的說明,可以將其作為一個類,例如直接將Battery()獨立出來
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_odometer(self,mileage):
“”“將里程錶讀數設定為指定的值”“”
if mileage>=self。odometer_reading:
self。odometer_reading=mileage
else:
print(“你不能輸入比原來里程還小的值”)
def increment_odometer(self,miles):
“”“將里程錶讀數增加設定的量”“”
self。odometer_reading+=miles
class Battery():
“”“一次模擬汽車電瓶的簡單嘗試”“”
def __init__(self,batter_size=70):
“”“初始化電瓶屬性”“”
self。batter_size=batter_size
def describe_battery(self):
“”“列印一條描述電瓶容量的訊息”“”
print(“This car has a ”+str(self。batter_size)+“-kWh battery。”)
class ElectricCar(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()
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_odometer(self,mileage):
“”“將里程錶讀數設定為指定的值”“”
if mileage>=self。odometer_reading:
self。odometer_reading=mileage
else:
print(“你不能輸入比原來里程還小的值”)
def increment_odometer(self,miles):
“”“將里程錶讀數增加設定的量”“”
self。odometer_reading+=miles
class Battery():
“”“一次模擬汽車電瓶的簡單嘗試”“”
def __init__(self,batter_size=70):
“”“初始化電瓶屬性”“”
self。batter_size=batter_size
def describe_battery(self):
“”“列印一條描述電瓶容量的訊息”“”
print(“This car has a ”+str(self。batter_size)+“-kWh battery。”)
def get_range(self):
range=self。batter_size*3
message=“這輛車可以走大約”+str(range)+“km路”
print(message)
class ElectricCar(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()
9。4 匯入類
與函式方法類似