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

通過一個例子來了解類

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_namestore_type是自定義的魏烫;self必須位于所有形參位置的第一個辣苏;self的作用是,當(dāng)實例化一個類的對象時哄褒,會將該實例對象自動傳入self

self.store_nameself.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ū)ο缶幊?類 二

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末囤攀,一起剝皮案震驚了整個濱河市软免,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焚挠,老刑警劉巖膏萧,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宣蔚,居然都是意外死亡向抢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門胚委,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挟鸠,“玉大人,你說我怎么就攤上這事亩冬∷蚁#” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵硅急,是天一觀的道長覆享。 經(jīng)常有香客問我,道長营袜,這世上最難降的妖魔是什么撒顿? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮荚板,結(jié)果婚禮上凤壁,老公的妹妹穿的比我還像新娘。我一直安慰自己跪另,他們只是感情好拧抖,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著免绿,像睡著了一般唧席。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘲驾,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天淌哟,我揣著相機(jī)與錄音,去河邊找鬼距淫。 笑死绞绒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的榕暇。 我是一名探鬼主播蓬衡,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼喻杈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狰晚?” 一聲冷哼從身側(cè)響起筒饰,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壁晒,沒想到半個月后减宣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芜赌,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了统舀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片更啄。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡纳令,死狀恐怖柠贤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雷滋,我是刑警寧澤不撑,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站晤斩,受9級特大地震影響焕檬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澳泵,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一实愚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兔辅,春花似錦爆侣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茫负。三九已至蕉鸳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忍法,已是汗流浹背潮尝。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留饿序,地道東北人勉失。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像原探,于是被迫代替她去往敵國和親乱凿。 傳聞我的和親對象是個殘疾皇子顽素,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容