目前為止伞梯,繼承可能讓人費解,子類和父類擁有一樣的屬性和方法(行為)帚屉,那這個子類還有什么意義谜诫?
實際上,通過繼承攻旦,可以大大的節(jié)省重新寫代碼的工作喻旷,并且,子類是可以擁有個性化的屬性與方法的
定義子類的專屬屬性和方法
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):
"""開始營業(yè)"""
print(self.store_name, '開始營業(yè)')
def close_sotre(self):
"""商店打烊"""
print(self.store_name, '已經(jīng)打烊')
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+'數(shù)量不足牢屋,無法出售且预,請忙進貨')
class FoodStore(Store):
"""食品小店"""
def __init__(self, store_name, store_type, commodity_list):
"""初始化"""
# 調(diào)用父類中的構(gòu)造方法槽袄,通過下面的代碼讓子類包含父類中的屬性與方法
super().__init__(store_name, store_type, commodity_list)
# 小紅的食品小店安裝了一個自動問候器,每當有顧客上門的時候就會發(fā)發(fā)問候
self.greetings = 'Welcome. Nice to meet you!'
def say_hello(self):
"""向顧客發(fā)出問候語"""
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!'
是為子類定義的一個屬性锋谐,這里沒有通過傳遞的方式來初始化參數(shù)遍尺,而是給了一個默認值
def say_hello(self):
該方法是子類中自定義的方法,用來打印問候語
變量與屬性
class Store():
"""模擬一個小商店"""
# --略--
class FoodStore(Store):
"""食品小店"""
def __init__(self, store_name, store_type, commodity_list):
"""初始化"""
# 調(diào)用父類中的構(gòu)造方法涮拗,通過下面的代碼讓子類包含父類中的屬性與方法
super().__init__(store_name, store_type, commodity_list)
# 小紅的食品小店安裝了一個自動問候器乾戏,每當有顧客上門的時候就會發(fā)發(fā)問候
self.greetings = 'Welcome. Nice to meet you!'
def say_hello(self):
"""向顧客發(fā)出問候語"""
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 = 'hello'
print(FoodStore.greetings)
輸出:
Welcome. Nice to meet you!
Welcome. Nice to meet you!
Welcome. Nice to meet you!
hello
可以看出,如果要訪問類中的變量三热,需要通過類名+.
訪問鼓择,而不是類的實例
而且可以在類的外部對變量值進行訪問,同樣康铭,屬性的值也可以在外部進行訪問修改
如果子類定義一個方法與父類的方法名稱一樣惯退,但是功能不一樣,結(jié)果會怎么樣呢从藤?
重寫父類方法
如果在子類中定義了與父類中一樣的方法名催跪,那Python會忽略父類中的該方法,轉(zhuǎn)而采用子類的方法夷野;也就是說懊蒸,子類可以在該方法中重新定義方法的行為
例:
class Store():
"""模擬一個小商店"""
# --略--
class FoodStore(Store):
"""食品小店"""
# 問候語
greetings = 'Welcome. Nice to meet you!'
def __init__(self, store_name, store_type, commodity_list):
"""初始化"""
# 調(diào)用父類中的構(gòu)造方法,通過下面的代碼讓子類包含父類中的屬性與方法
super().__init__(store_name, store_type, commodity_list)
def say_hello(self):
"""向顧客發(fā)出問候語"""
print(FoodStore.greetings)
def open_store(self, week_day):
"""開始營業(yè)"""
# 如果是星期日悯搔,則不休息一天
if week_day == 7:
print("今天不營業(yè)骑丸!")
else:
print(self.store_name, '開始營業(yè)')
# 定義一個商品清單
food_list = {'apple':100, 'milk':210, 'pear':72}
# 實例化一個叫商店叫美麗商店
food_store = FoodStore('美麗商店', 'supermarket', food_list)
# 調(diào)用方法
food_store.open_store(7)
輸出:
今天不營業(yè)!
def open_store(self, week_day):
重寫了父類的open_store()
方法妒貌;這里通危,該方法接收一個表示星期幾的參數(shù),如果是星期日(7)則本天休息一天不營業(yè)
通過輸出可以看出灌曙,在調(diào)用opne_store()
方法的時候菊碟,Python調(diào)用的是子類中的方法
將類封裝進模塊中,使用的時候?qū)腩?/h3>
將下面代碼保存到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):
"""開始營業(yè)"""
print(self.store_name, '開始營業(yè)')
def close_sotre(self):
"""商店打烊"""
print(self.store_name, '已經(jīng)打烊')
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+'數(shù)量不足在刺,無法出售逆害,請忙進貨')
然后將下面代碼保存到my_store.py文件中,然后導入sotre模塊中的Store類
# 導入sotre模塊中的Store類
form store import Store
class FoodStore(Store):
"""食品小店"""
# 問候語
greetings = 'Welcome. Nice to meet you!'
def __init__(self, store_name, store_type, commodity_list):
"""初始化"""
# 調(diào)用父類中的構(gòu)造方法蚣驼,通過下面的代碼讓子類包含父類中的屬性與方法
super().__init__(store_name, store_type, commodity_list)
def say_hello(self):
"""向顧客發(fā)出問候語"""
print(FoodStore.greetings)
def open_store(self, week_day):
"""開始營業(yè)"""
# 如果是星期日魄幕,則不休息一天
if week_day == 7:
print("今天不營業(yè)!")
else:
print(self.store_name, '開始營業(yè)')
也可以將Store類與FoodStore類都保存到一個類中颖杏,然后在主程序中調(diào)用
將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):
"""開始營業(yè)"""
print(self.store_name, '開始營業(yè)')
def close_sotre(self):
"""商店打烊"""
print(self.store_name, '已經(jīng)打烊')
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+'數(shù)量不足,無法出售,請忙進貨')
class FoodStore(Store):
"""食品小店"""
# 問候語
greetings = 'Welcome. Nice to meet you!'
def __init__(self, store_name, store_type, commodity_list):
"""初始化"""
# 調(diào)用父類中的構(gòu)造方法队丝,通過下面的代碼讓子類包含父類中的屬性與方法
super().__init__(store_name, store_type, commodity_list)
def say_hello(self):
"""向顧客發(fā)出問候語"""
print(FoodStore.greetings)
def open_store(self, week_day):
"""開始營業(yè)"""
# 如果是星期日靡馁,則不休息一天
if week_day == 7:
print("今天不營業(yè)!")
else:
print(self.store_name, '開始營業(yè)')
main.py文件如下:
# 導入一個模塊下的兩個類
from store import Store,FoodStore
# 定義一個商品清單
food_list = {'apple':100, 'milk':210, 'pear':72}
# 實例化一個Store對象
my_store = Store('我的商店', 'supermarket', food_list)
# 開始營業(yè)
my_store.open_store()
# 實例化一個叫商店叫美麗商店
food_store = FoodStore('美麗商店', 'supermarket', food_list)
# 開始營業(yè)
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)
# 開始營業(yè)
my_store.open_store()
# 實例化一個叫商店叫美麗商店
food_store = s.FoodStore('美麗商店', 'supermarket', food_list)
# 開始營業(yè)
food_store.open_store(7)
輸出:
我的商店 開始營業(yè)
今天不營業(yè)臭墨!
Python標準庫
安裝好的Python包含一組標準庫,在導入標準庫中的模塊與函數(shù)時膘盖,與上面的原理是一樣的
并且胧弛,多人協(xié)作的時候,也只可以通過上面的方式導入別人寫好的模塊
目錄
上一章 Python Learning-面向?qū)ο缶幊?類 一
下一章 Python Learning-文件處理