Python Learning-面向對象編程-類 二
來自專欄 Python與數據分析1 人贊了文章
目前為止,繼承可能讓人費解,子類和父類擁有一樣的屬性和方法(行為),那這個子類還有什麼意義?
實際上,通過繼承,可以大大的節省重新寫代碼的工作,並且,子類是可以擁有個性化的屬性與方法的
定義子類的專屬屬性和方法
class Store(): """模擬一個小商店""" def __init__(self, store_name, store_type, commodity_list): """初始化屬性store_name和store_type""" self.store_name = store_name self.store_type = store_type self.commodity_list = commodity_list def open_store(self): """開始營業""" print(self.store_name, 開始營業) def close_sotre(self): """商店打烊""" print(self.store_name, 已經打烊) def sell(self, commodity, quantity): """進貨""" if commodity not in self.commodity_list.keys(): print(本商店沒有+commodity) return self.commodity_list[commodity] += quantity print(商品+commodity+進貨了+str(quantity)+件) def stock(self, commodity, quantity): """售貨""" if commodity not in self.commodity_list.keys(): self.commodity_list[commodity] = quantity print(新增商品+commodity+str(quantity)+件) return if self.commodity_list[commodity] >= quantity: self.commodity_list[commodity] += quantity print(商品+commodity+出售了+str(quantity)+件) else: print(商品+commodity+數量不足,無法出售,請忙進貨)class FoodStore(Store): """食品小店""" def __init__(self, store_name, store_type, commodity_list): """初始化""" # 調用父類中的構造方法,通過下面的代碼讓子類包含父類中的屬性與方法 super().__init__(store_name, store_type, commodity_list) # 小紅的食品小店安裝了一個自動問候器,每當有顧客上門的時候就會發發問候 self.greetings = Welcome. Nice to meet you! def say_hello(self): """向顧客發出問候語""" print(self.greetings)# 定義一個商品清單food_list = {apple:100, milk:210, pear:72}# 實例化一個叫商店叫美麗商店food_store = FoodStore(美麗商店, supermarket, food_list)# 訪問父類中的方法與屬性print(food_store.commodity_list)# 出售5個蘋果food_store.sell(apple,5)print(-*10)# 訪問子類的方法與屬性print(food_store.greetings)# 訪問子類中的方法food_store.say_hello()
輸出:
{apple: 100, milk: 210, pear: 72}
商品apple進貨了5件 ---------- Welcome. Nice to meet you!Welcome. Nice to meet you!
self.greetings = Welcome. Nice to meet you!
是為子類定義的一個屬性,這裡沒有通過傳遞的方式來初始化參數,而是給了一個默認值
def say_hello(self):
該方法是子類中自定義的方法,用來列印問候語
變數與屬性
class Store(): """模擬一個小商店""" # --略--class FoodStore(Store): """食品小店""" def __init__(self, store_name, store_type, commodity_list): """初始化""" # 調用父類中的構造方法,通過下面的代碼讓子類包含父類中的屬性與方法 super().__init__(store_name, store_type, commodity_list) # 小紅的食品小店安裝了一個自動問候器,每當有顧客上門的時候就會發發問候 self.greetings = Welcome. Nice to meet you! def say_hello(self): """向顧客發出問候語""" print(self.greetings)# 定義一個商品清單food_list = {apple:100, milk:210, pear:72}# 實例化一個叫商店叫美麗商店food_store = FoodStore(美麗商店, supermarket, food_list)# 訪問子類的方法與屬性print(food_store.greetings)# 訪問子類中的方法food_store.say_hello()# 訪問類中的變數print(FoodStore.greetings)# 修改類中的變數值FoodStore.greetings = helloprint(FoodStore.greetings)
輸出:
Welcome. Nice to meet you!
Welcome. Nice to meet you!Welcome. Nice to meet you!
hello
可以看出,如果要訪問類中的變數,需要通過類名+.
訪問,而不是類的實例
而且可以在類的外部對變數值進行訪問,同樣,屬性的值也可以在外部進行訪問修改
如果子類定義一個方法與父類的方法名稱一樣,但是功能不一樣,結果會怎麼樣呢?
重寫父類方法
如果在子類中定義了與父類中一樣的方法名,那Python會忽略父類中的該方法,轉而採用子類的方法;也就是說,子類可以在該方法中重新定義方法的行為
例:
class Store(): """模擬一個小商店""" # --略--class FoodStore(Store): """食品小店""" # 問候語 greetings = Welcome. Nice to meet you! def __init__(self, store_name, store_type, commodity_list): """初始化""" # 調用父類中的構造方法,通過下面的代碼讓子類包含父類中的屬性與方法 super().__init__(store_name, store_type, commodity_list) def say_hello(self): """向顧客發出問候語""" print(FoodStore.greetings) def open_store(self, week_day): """開始營業""" # 如果是星期日,則不休息一天 if week_day == 7: print("今天不營業!") else: print(self.store_name, 開始營業)# 定義一個商品清單food_list = {apple:100, milk:210, pear:72}# 實例化一個叫商店叫美麗商店food_store = FoodStore(美麗商店, supermarket, food_list)# 調用方法food_store.open_store(7)
輸出:
今天不營業!
def open_store(self, week_day):
重寫了父類的open_store()
方法;這裡,該方法接收一個表示星期幾的參數,如果是星期日(7)則本天休息一天不營業
通過輸出可以看出,在調用opne_store()
方法的時候,Python調用的是子類中的方法
將類封裝進模塊中,使用的時候導入類
將下面代碼保存到store.py文件中
class Store(): """模擬一個小商店""" def __init__(self, store_name, store_type, commodity_list): """初始化屬性store_name和store_type""" self.store_name = store_name self.store_type = store_type self.commodity_list = commodity_list def open_store(self): """開始營業""" print(self.store_name, 開始營業) def close_sotre(self): """商店打烊""" print(self.store_name, 已經打烊) def sell(self, commodity, quantity): """進貨""" if commodity not in self.commodity_list.keys(): print(本商店沒有+commodity) return self.commodity_list[commodity] += quantity print(商品+commodity+進貨了+str(quantity)+件) def stock(self, commodity, quantity): """售貨""" if commodity not in self.commodity_list.keys(): self.commodity_list[commodity] = quantity print(新增商品+commodity+str(quantity)+件) return if self.commodity_list[commodity] >= quantity: self.commodity_list[commodity] += quantity print(商品+commodity+出售了+str(quantity)+件) else: print(商品+commodity+數量不足,無法出售,請忙進貨)
然後將下面代碼保存到my_store.py文件中,然後導入sotre模塊中的Store類
# 導入sotre模塊中的Store類form store import Storeclass FoodStore(Store): """食品小店""" # 問候語 greetings = Welcome. Nice to meet you! def __init__(self, store_name, store_type, commodity_list): """初始化""" # 調用父類中的構造方法,通過下面的代碼讓子類包含父類中的屬性與方法 super().__init__(store_name, store_type, commodity_list) def say_hello(self): """向顧客發出問候語""" print(FoodStore.greetings) def open_store(self, week_day): """開始營業""" # 如果是星期日,則不休息一天 if week_day == 7: print("今天不營業!") else: print(self.store_name, 開始營業)
也可以將Store類與FoodStore類都保存到一個類中,然後在主程序中調用
將Store類與FoodStore類都保存到store.py文件中,然後在main.py文件中引用它們
sotre.py文件如下:
class Store(): """模擬一個小商店""" def __init__(self, store_name, store_type, commodity_list): """初始化屬性store_name和store_type""" self.store_name = store_name self.store_type = store_type self.commodity_list = commodity_list def open_store(self): """開始營業""" print(self.store_name, 開始營業) def close_sotre(self): """商店打烊""" print(self.store_name, 已經打烊) def sell(self, commodity, quantity): """進貨""" if commodity not in self.commodity_list.keys(): print(本商店沒有+commodity) return self.commodity_list[commodity] += quantity print(商品+commodity+進貨了+str(quantity)+件) def stock(self, commodity, quantity): """售貨""" if commodity not in self.commodity_list.keys(): self.commodity_list[commodity] = quantity print(新增商品+commodity+str(quantity)+件) return if self.commodity_list[commodity] >= quantity: self.commodity_list[commodity] += quantity print(商品+commodity+出售了+str(quantity)+件) else: print(商品+commodity+數量不足,無法出售,請忙進貨)class FoodStore(Store): """食品小店""" # 問候語 greetings = Welcome. Nice to meet you! def __init__(self, store_name, store_type, commodity_list): """初始化""" # 調用父類中的構造方法,通過下面的代碼讓子類包含父類中的屬性與方法 super().__init__(store_name, store_type, commodity_list) def say_hello(self): """向顧客發出問候語""" print(FoodStore.greetings) def open_store(self, week_day): """開始營業""" # 如果是星期日,則不休息一天 if week_day == 7: print("今天不營業!") else: print(self.store_name, 開始營業)
main.py文件如下:
# 導入一個模塊下的兩個類from store import Store,FoodStore# 定義一個商品清單food_list = {apple:100, milk:210, pear:72}# 實例化一個Store對象my_store = Store(我的商店, supermarket, food_list)# 開始營業my_store.open_store()# 實例化一個叫商店叫美麗商店food_store = FoodStore(美麗商店, supermarket, food_list)# 開始營業food_store.open_store(7)
也可以只導入模塊名,通過.
符號來訪問類
# 導入一個模塊下的兩個類improt store as s# 定義一個商品清單food_list = {apple:100, milk:210, pear:72}# 實例化一個Store對象my_sotre = s.Store(我的商店, supermarket, food_list)# 開始營業my_store.open_store()# 實例化一個叫商店叫美麗商店food_store = s.FoodStore(美麗商店, supermarket, food_list)# 開始營業food_store.open_store(7)
輸出:
我的商店 開始營業
今天不營業!
Python標準庫
安裝好的Python包含一組標準庫,在導入標準庫中的模塊與函數時,與上面的原理是一樣的
並且,多人協作的時候,也只可以通過上面的方式導入別人寫好的模塊
目錄
上一章 Python Learning-面向對象編程-類 一
下一章 Python Learning-文件處理
推薦閱讀:
※面向對象六大基本原則
※半精度浮點數實驗
※【白話python連載(9.2)】 python的os模塊
※Python字元串:替換,連接,拆分,反轉,大寫和小寫
※活見久,皮卡丘居然是一門編程語言?!