Python Learning-面向對象編程-類 二

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字元串:替換,連接,拆分,反轉,大寫和小寫
活見久,皮卡丘居然是一門編程語言?!

TAG:Python | 編程語言 | 面向對象編程 |