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

目前為止伞梯,繼承可能讓人費解,子類和父類擁有一樣的屬性和方法(行為)帚屉,那這個子類還有什么意義谜诫?

實際上,通過繼承攻旦,可以大大的節(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-文件處理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末侠畔,一起剝皮案震驚了整個濱河市结缚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌软棺,老刑警劉巖红竭,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喘落,居然都是意外死亡茵宪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門瘦棋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稀火,“玉大人,你說我怎么就攤上這事赌朋』四” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵沛慢,是天一觀的道長赡若。 經(jīng)常有香客問我,道長团甲,這世上最難降的妖魔是什么斩熊? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮伐庭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘分冈。我一直安慰自己圾另,他們只是感情好,可當我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布雕沉。 她就那樣靜靜地躺著集乔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扰路,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天尤溜,我揣著相機與錄音,去河邊找鬼汗唱。 笑死宫莱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的哩罪。 我是一名探鬼主播授霸,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼际插!你這毒婦竟也來了碘耳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤框弛,失蹤者是張志新(化名)和其女友劉穎辛辨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瑟枫,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡斗搞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了力奋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榜旦。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖景殷,靈堂內(nèi)的尸體忽然破棺而出溅呢,到底是詐尸還是另有隱情,我是刑警寧澤猿挚,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布咐旧,位于F島的核電站,受9級特大地震影響绩蜻,放射性物質(zhì)發(fā)生泄漏铣墨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一办绝、第九天 我趴在偏房一處隱蔽的房頂上張望伊约。 院中可真熱鬧,春花似錦孕蝉、人聲如沸屡律。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽超埋。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霍殴,已是汗流浹背媒惕。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留来庭,地道東北人妒蔚。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像巾腕,于是被迫代替她去往敵國和親面睛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,499評論 2 348

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