通過一個例子來了解類
class Store():
"""模擬一個小商店"""
def __init__(self, store_name, store_type):
"""初始化屬性store_name和store_type"""
self.store_name = store_name
self.store_type = store_type
def open_store(self):
"""開始營業(yè)"""
print(self.store_name, '開始營業(yè)')
def close_sotre(self):
"""商店打烊"""
print(self.store_name, '已經(jīng)打烊')
下面是本例的解讀:
代碼:
class Store():
"""模擬一個小商店"""
使用關(guān)鍵字class
來創(chuàng)建類萎胰,class
后面的Store
表示類名靠汁,約定類型開頭字母要大寫王暗,類名后面要加上一對()
代碼:
def __init__(self, store_name, store_type):
"""初始化屬性store_name和store_type"""
self.store_name = store_name
self.store_type = store_type
__init__
是一種特殊的方法(構(gòu)造方法)姊扔,它的寫法是init左右分別有兩個下劃線鳖枕,該方法會在類被例化時被調(diào)用魄梯;方法其實就是函數(shù),類中的函數(shù)一般叫作方法宾符;實例化是指創(chuàng)建一個真正的可在計算機(jī)內(nèi)存上運行的類的對象
這個方法中有三個形參酿秸,其中self
是必須的,而store_name
和store_type
是自定義的魏烫;self
必須位于所有形參位置的第一個辣苏;self
的作用是,當(dāng)實例化一個類的對象時哄褒,會將該實例對象自動傳入self
中
self.store_name
和self.store_type
中存儲在類的實例中的兩個屬性(變量)稀蟋,分別表示商店名字與商店類型,在實例化的時候读处,通過傳遞給形參中的值來賦予這兩個變量值糊治,這種操作方式叫做屬性的初始化——即給屬性一個初始的值
代碼:
def open_store(self):
"""開始營業(yè)"""
print(self.store_name, '開始營業(yè)')
def close_sotre(self):
"""商店打烊"""
print(self.store_name, '已經(jīng)打烊')
def open_store(self):
和def close_sotre(self):
分別是兩個自定義的方法,分別用來表示商店開始營業(yè)與打烊罚舱;類中的方法必須有一個self
形參井辜,通過self
來訪問該類的實例
創(chuàng)建類的實例
class Store():
"""模擬一個小商店"""
def __init__(self, store_name, store_type):
"""初始化屬性store_name和store_type"""
self.store_name = store_name
self.store_type = store_type
def open_store(self):
"""開始營業(yè)"""
print(self.store_name, '開始營業(yè)')
def close_sotre(self):
"""商店打烊"""
print(self.store_name, '已經(jīng)打烊')
# 實例化一個supermarket類型的超級商店
my_store = Store('超級商店', 'supermarket')
# 調(diào)用實例中的開始營業(yè)方法
my_store.open_store()
輸出:
超級商店 開始營業(yè)
Store('超級商店', 'supermarket')
表示創(chuàng)建一個Store
的實例;其中需要兩個參數(shù)管闷,因為在實例化的時候粥脚,會調(diào)用構(gòu)造方法__init__(self, store_name, store_type)
,self
是自動傳入的,所以不需要做任何操作包个,這里需要傳入的是商店名稱與商店類型兩個實參
這里刷允,將實例賦值給變量my_sotre
,如果要訪問實例中的屬性和方法冤留,可通過操作符.
來調(diào)用
通過類可以創(chuàng)建多個對象,避免了重復(fù)的代碼
class Store():
"""模擬一個小商店"""
def __init__(self, store_name, store_type):
"""初始化屬性store_name和store_type"""
self.store_name = store_name
self.store_type = store_type
def open_store(self):
"""開始營業(yè)"""
print(self.store_name, '開始營業(yè)')
def close_sotre(self):
"""商店打烊"""
print(self.store_name, '已經(jīng)打烊')
# 實例化一個supermarket類型的超級商店
my_store = Store('超級商店', 'supermarket')
# 調(diào)用實例中的開始營業(yè)方法
my_store.open_store()
# 創(chuàng)建一個百姓商店的小超市
baixing_store = Store('百姓商店', 'supermarket')
# 讓百姓商店開始營業(yè)
baixing_store.open_store()
# 讓百姓商店打烊
baixing_store.close_sotre()
# 打印百姓商店類型
print(baixing_store.store_type)
輸出:
超級商店 開始營業(yè)
百姓商店 開始營業(yè)
百姓商店 已經(jīng)打烊
supermarket
構(gòu)造方法
__init__
方法用于初始化實例中的屬性树灶,如果沒有需要初始化的自定義屬性纤怒,__init__
方法可以省略,默認(rèn)會創(chuàng)建一個構(gòu)造方法天通,只是不顯示而已泊窘,如下:
class Store():
"""模擬一個小商店"""
def open_store(self):
"""開始營業(yè)"""
print('開始營業(yè)')
def close_sotre(self):
"""商店打烊"""
print('已經(jīng)打烊')
my_store = Store()
my_store.open_store()
輸出:
開始營業(yè)
因為沒有要初始化的屬性,因此不需要傳遞任何實參(默認(rèn)傳遞了類的實例到self
中)像寒,而類默認(rèn)包含一個__init__(self):
構(gòu)造函數(shù)
動手動腦
創(chuàng)建一個可以進(jìn)貨烘豹、出貨的商店,用列表/字典來包含商品清單诺祸,出出售貨品的時候携悯,可以指定名稱與數(shù)量,并且從貨品清單里減去相應(yīng)數(shù)量筷笨,如果數(shù)量等于0后提醒進(jìn)貨憔鬼,進(jìn)貨的時候可以指定進(jìn)貨的商品與數(shù)量,并將貨品清單里的數(shù)量增加相應(yīng)數(shù)量
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):
"""進(jìn)貨"""
if commodity not in self.commodity_list.keys():
print('本商店沒有'+commodity)
return
self.commodity_list[commodity] += quantity
print('商品'+commodity+'進(jìn)貨了'+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ù)量不足胃夏,無法出售逊彭,請忙進(jìn)貨')
# 定義一個商品清單,key是名稱构订,value表示數(shù)量
commodity_list = {'apple':100, 'milk':210, 'towel':72, 'shower gel':55}
# 實例化一個叫商店叫美麗商店
my_store = Store('美麗商店', 'supermarket', commodity_list)
# 打印商品清單
print(my_store.commodity_list)
# 出售15個蘋果
my_store.sell('apple',15)
# 打印商品清單
print(my_store.commodity_list)
# 出售10件牛奶
my_store.sell('milk',10)
# 打印商品清單
print(my_store.commodity_list)
# 出售10件西紅柿
my_store.sell('tomato',10)
# 打印商品清單
print(my_store.commodity_list)
# 進(jìn)化100件西紅柿
my_store.stock('tomato',100)
# 打印商品清單
print(my_store.commodity_list)
輸出:
{'apple': 100, 'milk': 210, 'towel': 72, 'shower gel': 55}
商品apple進(jìn)貨了15件
{'apple': 115, 'milk': 210, 'towel': 72, 'shower gel': 55}
商品milk進(jìn)貨了10件
{'apple': 115, 'milk': 220, 'towel': 72, 'shower gel': 55}
本商店沒有tomato
{'apple': 115, 'milk': 220, 'towel': 72, 'shower gel': 55}
新增商品 tomato100件
{'apple': 115, 'milk': 220, 'towel': 72, 'shower gel': 55, ' tomato': 100}
上面的例子就中再解釋了,有不明白的可以看前面的章節(jié)避矢,或者給我留言
小紅知道你打造了一個一級棒的商店悼瘾,想請你幫助她打造一個食品小店,她愿意付給你一大筆酬勞
使用繼承
想要為小紅創(chuàng)建一個食品小店审胸,初步想法一定是再建立一個類似于Store的新類亥宿,使用繼承可以大大的簡化工作量
當(dāng)一個類A繼承另一個類B時,類A將擁有類B中所有的屬性與方法砂沛,B類叫做父類烫扼,A類叫做子類
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):
"""進(jìn)貨"""
if commodity not in self.commodity_list.keys():
print('本商店沒有'+commodity)
return
self.commodity_list[commodity] += quantity
print('商品'+commodity+'進(jìn)貨了'+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ù)量不足,無法出售碍庵,請忙進(jìn)貨')
# ---------以上的原來的類-----------
class FoodStore(Store):
"""食品小店"""
def __init__(self, store_name, store_type, commodity_list):
"""初始化"""
# 調(diào)用父類中的構(gòu)造方法映企,通過下面的代碼讓子類包含父類中的屬性與方法
super().__init__(store_name, store_type, commodity_list)
# 定義一個商品清單
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)
輸出:
{'apple': 100, 'milk': 210, 'pear': 72}
商品apple進(jìn)貨了5件
將父類的名稱寫在子類名稱后面的()
里,然后在構(gòu)造方法中通過super()
來調(diào)用父類的構(gòu)造方法静浴,來初始化父類堰氓;父類又叫做超類,所以采用super
的時候會訪問到Store
super().__init__(store_name, store_type, commodity_list)
也可以通過父類名來初始化父類苹享,如Store.__init__(self, store_name, store_type, commodity_list)
双絮,但是別忘記傳遞self
參數(shù)
雖然FoodStore
類中沒有sell
方法,但food_store.sell('apple',5)
依然可以執(zhí)行,說明子類是擁有父類中的方法與屬性的
目錄
上一章 Python Learning-函數(shù) 二
下一章 Python Learning-面向?qū)ο缶幊?類 二