中國(guó)做網(wǎng)站瀏覽器打開(kāi)網(wǎng)站
“”"
故事7:
小明把煎餅果子技術(shù)傳給徒弟的同時(shí), 不想把獨(dú)創(chuàng)配方傳給他, 我們就要加私有.
問(wèn): 既然不想讓子類(lèi)用, 為什么要加私有?
答: 私有的目的不是不讓子類(lèi)用, 而是不讓子類(lèi)直接用, 而必須通過(guò)特定的 途徑或者方式才能使用.
大白話: ATM機(jī)為啥要設(shè)計(jì)那么繁瑣, 直接搞個(gè)大箱子, 里邊放錢(qián), 存錢(qián)就直接放進(jìn)去, 取錢(qián)就直接拿多少, 何必要鎖的那么嚴(yán)實(shí), 留個(gè)插卡口, 鍵盤(pán)輸入密碼.
不能直接拿 要按照銀行定的規(guī)矩拿
“”"
class Prentice():def __init__(self):self.congfu = '[獨(dú)創(chuàng)煎餅果子配方]'def __make_cake(self):print(f'運(yùn)用{self.congfu} 制作煎餅果子')def my_make_cake_method(self):self.__make_cake()class TuSun(Prentice):passif __name__ == '__main__':t1 = TuSun()# t1.make_cake() #報(bào)錯(cuò) 方法私有后通過(guò)公共的訪問(wèn)方式調(diào)用 # t1.__make_cake() #報(bào)錯(cuò)t1.my_make_cake_method()
“”"
多態(tài)介紹:
概述:
多態(tài)是指通義事物在不同時(shí)刻(環(huán)境) 表現(xiàn)出的不用狀態(tài), 形態(tài)
Python: 同一個(gè)函數(shù) 接收不同的對(duì)象 達(dá)到不同的效果
實(shí)現(xiàn)條件:
1.要有繼承關(guān)系
2, 要有方法重寫(xiě)
3.要有父類(lèi)引用 指向 子類(lèi)對(duì)象
好處:
提高代碼擴(kuò)展性 和 可維護(hù)性
還記開(kāi)發(fā)中的應(yīng)用:
父類(lèi)充當(dāng)函數(shù)的形參類(lèi)型 這樣可以接受任意的子類(lèi)對(duì)象 實(shí)現(xiàn) 傳入什么子類(lèi) 就調(diào)用其對(duì)應(yīng)的功能
“”"
# 定義動(dòng)物類(lèi) 充當(dāng)父類(lèi)
class Animal():def speak(self):print('動(dòng)物會(huì)叫')# pass # 如果多個(gè)子類(lèi)的實(shí)現(xiàn)都不同 則直接用pass修飾即可class Dog(Animal):def speak(self):print('狗會(huì)汪汪汪的叫')class Cat(Animal):def speak(self):print('貓會(huì)喵喵喵')class Phone:def speak(self):print('手機(jī)會(huì)模仿各種聲音')def print_animal(an: Animal):an.speak()if __name__ == '__main__':a = Animal()d1 = Dog()c1 = Cat()p = Phone()print_animal(d1)print_animal(c1)print_animal(p)
# 直觀的感受父類(lèi)引用指向子類(lèi)對(duì)象
an : Animal = Dog()
“”"
需求:
構(gòu)建對(duì)象對(duì)戰(zhàn)平臺(tái)object_play(英雄機(jī), 敵機(jī))
1. 英雄一代戰(zhàn)機(jī)(戰(zhàn)斗力60)與敵軍戰(zhàn)機(jī)(戰(zhàn)斗力70)對(duì)抗。英雄1代戰(zhàn)機(jī)失敗!
2. 臥薪嘗膽,英雄二代戰(zhàn)機(jī)(戰(zhàn)斗力80)出場(chǎng)!,戰(zhàn)勝敵軍戰(zhàn)機(jī)!
3. 對(duì)象對(duì)戰(zhàn)平臺(tái)object_play, 代碼不發(fā)生變化的情況下, 完成多次戰(zhàn)斗
提示:
抽象戰(zhàn)機(jī)類(lèi) HeroFighter AdvHeroFighter;敵機(jī)EnemyFighter;
構(gòu)建對(duì)象戰(zhàn)斗平臺(tái), 使用多態(tài)實(shí)現(xiàn)
“”"
class HeroFight():def power(self):return 60
class AdvHeroFight(HeroFight):def power(self):return 80
class EnemyFughter():def power(self):return 70def object_play(hero:HeroFight, enemy:EnemyFughter):if hero.power() >= enemy.power():print('凱旋')else:print('鎩羽')if __name__ == '__main__':hero = HeroFight()hero2 = AdvHeroFight()enemy = EnemyFughter()object_play(hero, enemy)object_play(hero2, enemy)
“”"
抽象類(lèi)解釋:
概述:
有抽象方法的就叫抽象類(lèi) 也叫接口
抽象方法: 沒(méi)有方法體的方法 就叫抽象方法
格式:
class 類(lèi)名:
def 函數(shù)名(self):
pass
作用:
抽象類(lèi)一般充當(dāng)父類(lèi)使用 用于指定 行業(yè)規(guī)范
而具體的實(shí)現(xiàn) 是交由各個(gè)子類(lèi)完成
需求:假設(shè)國(guó)家規(guī)定空調(diào)必須有 冷風(fēng)熱風(fēng)左右擺風(fēng)的功能 現(xiàn)在又格力 美的 兩個(gè)廠商正產(chǎn)空調(diào) 請(qǐng)用所學(xué) 模擬此場(chǎng)景
“”"
# 創(chuàng)建抽象類(lèi) 表示標(biāo)準(zhǔn)\
class AC:def cool_wind(self):passdef hot_wind(self):passdef swing_l_r(self):pass
class Gree(AC):def cool_wind(self):print('格力空調(diào) 制造冷風(fēng)')def hot_wind(self):print('格力空調(diào),制造熱風(fēng)')def swing_l_r(self):print('格力空調(diào) 左右搖擺')class Media(AC):def cool_wind(self):print('美的空調(diào) 制造冷風(fēng)')def hot_wind(self):print('美的空調(diào) 制造冷風(fēng)')def swing_l_r(self):print('美的空調(diào) 制造冷風(fēng)')if __name__ == '__main__':g = Gree()m = Media()g.cool_wind()g.hot_wind()g.swing_l_r()m.cool_wind()m.hot_wind()m.swing_l_r()
(1)請(qǐng)寫(xiě)出單繼承與多繼承的語(yǔ)法格式?
“”"
# 單繼承
class 類(lèi)名(父類(lèi)名):重寫(xiě)方法
# 多繼承
class 類(lèi)名(父類(lèi)名1,父類(lèi)名2 ...):重寫(xiě)方法
"""
# (2)什么是方法重寫(xiě),為什么要方法重寫(xiě)?
"""
方法重寫(xiě)是 子類(lèi)繼承父類(lèi)后 將繼承父類(lèi)的方法邏輯重新編寫(xiě)
重寫(xiě)后的方法子啊父類(lèi)的功能主題上 具有子類(lèi)獨(dú)有的功能
""""""
(4)實(shí)操練習(xí):
- 1.創(chuàng)建一個(gè)Animal(動(dòng)物)基類(lèi),其中有一個(gè)run方法,輸出`跑起來(lái)....`;
- 2.創(chuàng)建一個(gè)Horse(馬)類(lèi)繼承于動(dòng)物類(lèi),Horse類(lèi)中不僅有run()方法還有eat()方法;
- 2.1run方法輸出 `跑起來(lái)....`
- 2.2 eat 方法輸出 `吃東西...`
"""# #創(chuàng)建父類(lèi)
# class Animal(object):
# #父類(lèi)方法
# def run(self):
# print('跑起來(lái)...')
#
# #創(chuàng)建子類(lèi) 繼承父類(lèi)
# class Horse(Animal):
# #子類(lèi)方法
# def eat(self):
# print('吃東西...')
#
#
# if __name__ == '__main__':
# h1 = Horse()
# h1.run()
# h1.eat()"""
(5)加強(qiáng)練習(xí):
- 1.創(chuàng)建一個(gè)動(dòng)物(Animal)的基類(lèi),其中有一個(gè)run方法, 輸出`跑起來(lái)....`
- 2。創(chuàng)建一個(gè)Horse(馬)類(lèi)繼承于動(dòng)物類(lèi),Horse類(lèi)中重寫(xiě)run方法,增加打印輸出"`邁著矯健的步伐跑起來(lái)!!`",同時(shí)實(shí)現(xiàn)eat方法, 輸出 `吃東西...`
"""# #創(chuàng)建父類(lèi)
# class Animal(object):
# #父類(lèi)方法
# def run(self):
# print('跑起來(lái)...')
#
# #創(chuàng)建子類(lèi) 繼承父類(lèi)
# class Horse(Animal):
# #重寫(xiě)run方法
# def run(self):
# print('`邁著矯健的步伐跑起來(lái)!!`')
# #子類(lèi)方法
# def eat(self):
# print('吃東西...')
#
#
# if __name__ == '__main__':
# h1 = Horse()
# h1.run()
# h1.eat()"""
(6)綜合訓(xùn)練:- 1.創(chuàng)建一個(gè)動(dòng)物(Animal)的基類(lèi),其中有一個(gè)run方法, 輸出`跑起來(lái)....`
- 2.創(chuàng)建一個(gè)Horse(馬)類(lèi)繼承于動(dòng)物類(lèi),Horse類(lèi)中不僅有run方法還有eat方法- 2.1 run方法輸出 `跑起來(lái)....`- 2.2 eat 方法輸出 `吃東西...`
- 3.創(chuàng)建一個(gè) SwiftHorse(千里馬)類(lèi)繼承Horse類(lèi),初始化init方法name屬性為千里馬,同時(shí)針對(duì)吃東西,SwiftHorse類(lèi)中重寫(xiě)eat方法,增加打印輸出"`一天可以吃一擔(dān)糧食...`"
"""#
# # 創(chuàng)建父類(lèi)
# class Animal(object):
# # 父類(lèi)方法
# def run(self):
# print('跑起來(lái)...')
#
#
# # 創(chuàng)建子類(lèi) 繼承父類(lèi)
# class Horse(Animal):
# # 重寫(xiě)run方法
# def run(self):
# print('`邁著矯健的步伐跑起來(lái)!!`')
#
# # 子類(lèi)方法
# def eat(self):
# print('吃東西...')
#
#
# class SwiftHorse(Horse):
# # init初始化
# def __init__(self):
# self.name = '千里馬'
#
# # 重寫(xiě)eat方法
# def eat(self):
# print(f'{self.name}`一天可以吃一擔(dān)糧食...`')
#
#
# if __name__ == '__main__':
# h1 = Horse()
# h1.run()
# h1.eat()
#
# h2 = SwiftHorse()
# print(h2.name)
# h2.eat()"""
(7)綜合訓(xùn)練:定義一個(gè)`Person` 類(lèi),包含初始化 init 方法:實(shí)例屬性: 名字, name年齡, age"""# 創(chuàng)建類(lèi)
class Person():# 初始化計(jì)數(shù)器 countcount = 0# init初始化參數(shù)def __init__(self, name, age):self.name = nameself.age = agePerson.count += 1def __str__(self):return f'此人的姓名為: {self.name} 年齡為: {self.age}'def __del__(self):Person.count -= 1
# 1. 記錄由該類(lèi)創(chuàng)建的對(duì)象的個(gè)數(shù),創(chuàng)建一個(gè)對(duì)象,計(jì)數(shù)+1,刪除一個(gè)對(duì)象,計(jì)數(shù)-1;
# count變量記錄對(duì)象數(shù)
# 2. 定義一個(gè)方法,可以打印當(dāng)前對(duì)象的個(gè)數(shù);def print_count():print(f'當(dāng)前對(duì)象數(shù): {Person.count}')# 3. 定義一個(gè)方法`show_info`, 輸出以下信息
# 這是一個(gè) Person 類(lèi),謝謝查看!def show_info():print(f'這是一個(gè) Person 類(lèi),謝謝查看!')# 需要傳對(duì)象# def show_info(self):# print(f'這是一個(gè) {self.__class__.__name__} 類(lèi),謝謝查看!')# 4. 打印對(duì)象的時(shí)候,可以輸出打印自己的名字和年齡
# 我的名字是 xxx, 年齡是 xxx
# 用 __str__ 魔法方法# 5. 定義一個(gè)方法 `study`, 輸出以下信息
# 我叫 xxx, 我要好好學(xué)習(xí)def study(self):print(f'我叫 {self.name} ,我要好好學(xué)習(xí)')# 6. 操作步驟
# 1. 調(diào)用`show_info `方法;
# 2. 創(chuàng)建兩個(gè)對(duì)象, 打印當(dāng)前對(duì)象,并打印當(dāng)前的對(duì)象個(gè)數(shù);
# 3. 分別使用兩個(gè)對(duì)象調(diào)用`study`方法;
# 4. 刪除一個(gè)對(duì)象,打印輸出當(dāng)前的對(duì)象個(gè)數(shù)。
if __name__ == '__main__':Person.show_info()p1 = Person('菲菲', 17)p2 = Person('波比', 18)print(p1)print(p2)Person.print_count()p1.study()p2.study()# p.show_info()# p.print_count()p2.__del__()Person.print_count()
“”"
構(gòu)建對(duì)象對(duì)戰(zhàn)平臺(tái)object_play
1 英雄一代戰(zhàn)機(jī)(戰(zhàn)斗力60)與敵軍戰(zhàn)機(jī)(戰(zhàn)斗力70)對(duì)抗。英雄1代戰(zhàn)機(jī)失敗!
2 臥薪嘗膽,英雄二代戰(zhàn)機(jī)(戰(zhàn)斗力80)出場(chǎng)!,戰(zhàn)勝敵軍戰(zhàn)機(jī)!
3 對(duì)象對(duì)戰(zhàn)平臺(tái)object_play, 代碼不發(fā)生變化的情況下, 完成多次戰(zhàn)斗
“”"
#
# class HeroFly():
# def fight(self):
# return 60
#
# class HeroFlyPlus(HeroFly):
# def fight(self):
# return 80
#
# class JapanFly():
# def fight(self):
# return 70
#
# def object_play(hero : HeroFly, japan : JapanFly):
# if hero.fight() >= japan.fight():
# print('凱旋')
# else:
# print('鎩羽')
#
# if __name__ == '__main__':
# h1 = HeroFly()
# h2 = HeroFlyPlus()
# j1 = JapanFly()
# object_play(h1, j1)
# object_play(h2, j1)
堅(jiān)持分享 共同進(jìn)步 如有錯(cuò)誤 歡迎指出