Python Learning-面向?qū)ο缶幊?類 一

通過一個(gè)例子來了解類

class Store():
    """模擬一個(gè)小商店"""
    
    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íng)業(yè)"""
        print(self.store_name, '開始營(yíng)業(yè)')
        
    def close_sotre(self):
        """商店打烊"""
        print(self.store_name, '已經(jīng)打烊')

下面是本例的解讀

代碼:

class Store():
    """模擬一個(gè)小商店"""

使用關(guān)鍵字class來創(chuàng)建類,class后面的Store表示類名,約定類型開頭字母要大寫,類名后面要加上一對(duì)()

代碼:

    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左右分別有兩個(gè)下劃線,該方法會(huì)在類被例化時(shí)被調(diào)用;方法其實(shí)就是函數(shù),類中的函數(shù)一般叫作方法;實(shí)例化是指創(chuàng)建一個(gè)真正的可在計(jì)算機(jī)內(nèi)存上運(yùn)行的類的對(duì)象

這個(gè)方法中有三個(gè)形參,其中self是必須的,而store_namestore_type是自定義的;self必須位于所有形參位置的第一個(gè);self的作用是,當(dāng)實(shí)例化一個(gè)類的對(duì)象時(shí),會(huì)將該實(shí)例對(duì)象自動(dòng)傳入self

self.store_nameself.store_type中存儲(chǔ)在類的實(shí)例中的兩個(gè)屬性(變量),分別表示商店名字商店類型,在實(shí)例化的時(shí)候,通過傳遞給形參中的值來賦予這兩個(gè)變量值,這種操作方式叫做屬性的初始化——即給屬性一個(gè)初始的值

代碼:

    def open_store(self):
        """開始營(yíng)業(yè)"""
        print(self.store_name, '開始營(yíng)業(yè)')
        
    def close_sotre(self):
        """商店打烊"""
        print(self.store_name, '已經(jīng)打烊')

def open_store(self):def close_sotre(self):分別是兩個(gè)自定義的方法,分別用來表示商店開始營(yíng)業(yè)與打烊;類中的方法必須有一個(gè)self形參,通過self來訪問該類的實(shí)例

創(chuàng)建類的實(shí)例

class Store():
    """模擬一個(gè)小商店"""
    
    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íng)業(yè)"""
        print(self.store_name, '開始營(yíng)業(yè)')
        
    def close_sotre(self):
        """商店打烊"""
        print(self.store_name, '已經(jīng)打烊')

# 實(shí)例化一個(gè)supermarket類型的超級(jí)商店
my_store = Store('超級(jí)商店', 'supermarket')
# 調(diào)用實(shí)例中的開始營(yíng)業(yè)方法
my_store.open_store()

輸出:

超級(jí)商店 開始營(yíng)業(yè)

Store('超級(jí)商店', 'supermarket')表示創(chuàng)建一個(gè)Store的實(shí)例;其中需要兩個(gè)參數(shù),因?yàn)樵趯?shí)例化的時(shí)候,會(huì)調(diào)用構(gòu)造方法__init__(self, store_name, store_type),self是自動(dòng)傳入的,所以不需要做任何操作,這里需要傳入的是商店名稱與商店類型兩個(gè)實(shí)參

這里,將實(shí)例賦值給變量my_sotre,如果要訪問實(shí)例中的屬性和方法,可通過操作符.來調(diào)用

通過類可以創(chuàng)建多個(gè)對(duì)象,避免了重復(fù)的代碼

class Store():
    """模擬一個(gè)小商店"""
    
    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íng)業(yè)"""
        print(self.store_name, '開始營(yíng)業(yè)')
        
    def close_sotre(self):
        """商店打烊"""
        print(self.store_name, '已經(jīng)打烊')

# 實(shí)例化一個(gè)supermarket類型的超級(jí)商店
my_store = Store('超級(jí)商店', 'supermarket')
# 調(diào)用實(shí)例中的開始營(yíng)業(yè)方法
my_store.open_store()

# 創(chuàng)建一個(gè)百姓商店的小超市
baixing_store = Store('百姓商店', 'supermarket')
# 讓百姓商店開始營(yíng)業(yè)
baixing_store.open_store()
# 讓百姓商店打烊
baixing_store.close_sotre()
# 打印百姓商店類型
print(baixing_store.store_type)

輸出:

超級(jí)商店 開始營(yíng)業(yè)
百姓商店 開始營(yíng)業(yè)
百姓商店 已經(jīng)打烊
supermarket

構(gòu)造方法

__init__方法用于初始化實(shí)例中的屬性,如果沒有需要初始化的自定義屬性,__init__方法可以省略,默認(rèn)會(huì)創(chuàng)建一個(gè)構(gòu)造方法,只是不顯示而已,如下:

class Store():
    """模擬一個(gè)小商店"""
        
    def open_store(self):
        """開始營(yíng)業(yè)"""
        print('開始營(yíng)業(yè)')
        
    def close_sotre(self):
        """商店打烊"""
        print('已經(jīng)打烊')
        
my_store = Store()
my_store.open_store()

輸出:

開始營(yíng)業(yè)

因?yàn)闆]有要初始化的屬性,因此不需要傳遞任何實(shí)參(默認(rèn)傳遞了類的實(shí)例到self中),而類默認(rèn)包含一個(gè)__init__(self):構(gòu)造函數(shù)

動(dòng)手動(dòng)腦

創(chuàng)建一個(gè)可以進(jìn)貨、出貨的商店,用列表/字典來包含商品清單,出出售貨品的時(shí)候,可以指定名稱與數(shù)量,并且從貨品清單里減去相應(yīng)數(shù)量,如果數(shù)量等于0后提醒進(jìn)貨,進(jìn)貨的時(shí)候可以指定進(jìn)貨的商品與數(shù)量,并將貨品清單里的數(shù)量增加相應(yīng)數(shù)量

class Store():
    """模擬一個(gè)小商店"""
    
    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íng)業(yè)"""
        print(self.store_name, '開始營(yíng)業(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ù)量不足,無法出售,請(qǐng)忙進(jìn)貨')

# 定義一個(gè)商品清單,key是名稱,value表示數(shù)量
commodity_list = {'apple':100, 'milk':210, 'towel':72, 'shower gel':55}
# 實(shí)例化一個(gè)叫商店叫美麗商店
my_store = Store('美麗商店', 'supermarket', commodity_list)
# 打印商品清單
print(my_store.commodity_list)

# 出售15個(gè)蘋果
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é),或者給我留言

小紅知道你打造了一個(gè)一級(jí)棒的商店,想請(qǐng)你幫助她打造一個(gè)食品小店,她愿意付給你一大筆酬勞

使用繼承

想要為小紅創(chuàng)建一個(gè)食品小店,初步想法一定是再建立一個(gè)類似于Store的新類,使用繼承可以大大的簡(jiǎn)化工作量

當(dāng)一個(gè)類A繼承另一個(gè)類B時(shí),類A將擁有類B中所有的屬性與方法,B類叫做父類,A類叫做子類

class Store():
    """模擬一個(gè)小商店"""
    
    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íng)業(yè)"""
        print(self.store_name, '開始營(yíng)業(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ù)量不足,無法出售,請(qǐng)忙進(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)

# 定義一個(gè)商品清單
food_list = {'apple':100, 'milk':210, 'pear':72}
# 實(shí)例化一個(gè)叫商店叫美麗商店
food_store = FoodStore('美麗商店', 'supermarket', food_list)
# 打印商品清單
print(food_store.commodity_list)
# 出售5個(gè)蘋果
food_store.sell('apple',5)

輸出:

{'apple': 100, 'milk': 210, 'pear': 72}
商品apple進(jìn)貨了5件

將父類的名稱寫在子類名稱后面的()里,然后在構(gòu)造方法中通過super()來調(diào)用父類的構(gòu)造方法,來初始化父類;父類又叫做超類,所以采用super的時(shí)候會(huì)訪問到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ū)ο缶幊?類 二

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容