中國做網(wǎng)站瀏覽器打開網(wǎng)站
“”"
故事7:
小明把煎餅果子技術(shù)傳給徒弟的同時(shí), 不想把獨(dú)創(chuàng)配方傳給他, 我們就要加私有.
問: 既然不想讓子類用, 為什么要加私有?
答: 私有的目的不是不讓子類用, 而是不讓子類直接用, 而必須通過特定的 途徑或者方式才能使用.
大白話: ATM機(jī)為啥要設(shè)計(jì)那么繁瑣, 直接搞個(gè)大箱子, 里邊放錢, 存錢就直接放進(jìn)去, 取錢就直接拿多少, 何必要鎖的那么嚴(yán)實(shí), 留個(gè)插卡口, 鍵盤輸入密碼.
不能直接拿 要按照銀行定的規(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ò) 方法私有后通過公共的訪問方式調(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, 要有方法重寫
3.要有父類引用 指向 子類對(duì)象
好處:
提高代碼擴(kuò)展性 和 可維護(hù)性
還記開發(fā)中的應(yīng)用:
父類充當(dāng)函數(shù)的形參類型 這樣可以接受任意的子類對(duì)象 實(shí)現(xiàn) 傳入什么子類 就調(diào)用其對(duì)應(yīng)的功能
“”"
# 定義動(dòng)物類 充當(dāng)父類
class Animal():def speak(self):print('動(dòng)物會(huì)叫')# pass # 如果多個(gè)子類的實(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)
# 直觀的感受父類引用指向子類對(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ī)類 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)
“”"
抽象類解釋:
概述:
有抽象方法的就叫抽象類 也叫接口
抽象方法: 沒有方法體的方法 就叫抽象方法
格式:
class 類名:
def 函數(shù)名(self):
pass
作用:
抽象類一般充當(dāng)父類使用 用于指定 行業(yè)規(guī)范
而具體的實(shí)現(xiàn) 是交由各個(gè)子類完成
需求:假設(shè)國家規(guī)定空調(diào)必須有 冷風(fēng)熱風(fēng)左右擺風(fēng)的功能 現(xiàn)在又格力 美的 兩個(gè)廠商正產(chǎn)空調(diào) 請(qǐng)用所學(xué) 模擬此場(chǎng)景
“”"
# 創(chuàng)建抽象類 表示標(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)寫出單繼承與多繼承的語法格式?
“”"
# 單繼承
class 類名(父類名):重寫方法
# 多繼承
class 類名(父類名1,父類名2 ...):重寫方法
"""
# (2)什么是方法重寫,為什么要方法重寫?
"""
方法重寫是 子類繼承父類后 將繼承父類的方法邏輯重新編寫
重寫后的方法子啊父類的功能主題上 具有子類獨(dú)有的功能
""""""
(4)實(shí)操練習(xí):
- 1.創(chuàng)建一個(gè)Animal(動(dòng)物)基類,其中有一個(gè)run方法,輸出`跑起來....`;
- 2.創(chuàng)建一個(gè)Horse(馬)類繼承于動(dòng)物類,Horse類中不僅有run()方法還有eat()方法;
- 2.1run方法輸出 `跑起來....`
- 2.2 eat 方法輸出 `吃東西...`
"""# #創(chuàng)建父類
# class Animal(object):
# #父類方法
# def run(self):
# print('跑起來...')
#
# #創(chuàng)建子類 繼承父類
# class Horse(Animal):
# #子類方法
# def eat(self):
# print('吃東西...')
#
#
# if __name__ == '__main__':
# h1 = Horse()
# h1.run()
# h1.eat()"""
(5)加強(qiáng)練習(xí):
- 1.創(chuàng)建一個(gè)動(dòng)物(Animal)的基類,其中有一個(gè)run方法, 輸出`跑起來....`
- 2。創(chuàng)建一個(gè)Horse(馬)類繼承于動(dòng)物類,Horse類中重寫run方法,增加打印輸出"`邁著矯健的步伐跑起來!!`",同時(shí)實(shí)現(xiàn)eat方法, 輸出 `吃東西...`
"""# #創(chuàng)建父類
# class Animal(object):
# #父類方法
# def run(self):
# print('跑起來...')
#
# #創(chuàng)建子類 繼承父類
# class Horse(Animal):
# #重寫run方法
# def run(self):
# print('`邁著矯健的步伐跑起來!!`')
# #子類方法
# def eat(self):
# print('吃東西...')
#
#
# if __name__ == '__main__':
# h1 = Horse()
# h1.run()
# h1.eat()"""
(6)綜合訓(xùn)練:- 1.創(chuàng)建一個(gè)動(dòng)物(Animal)的基類,其中有一個(gè)run方法, 輸出`跑起來....`
- 2.創(chuàng)建一個(gè)Horse(馬)類繼承于動(dòng)物類,Horse類中不僅有run方法還有eat方法- 2.1 run方法輸出 `跑起來....`- 2.2 eat 方法輸出 `吃東西...`
- 3.創(chuàng)建一個(gè) SwiftHorse(千里馬)類繼承Horse類,初始化init方法name屬性為千里馬,同時(shí)針對(duì)吃東西,SwiftHorse類中重寫eat方法,增加打印輸出"`一天可以吃一擔(dān)糧食...`"
"""#
# # 創(chuàng)建父類
# class Animal(object):
# # 父類方法
# def run(self):
# print('跑起來...')
#
#
# # 創(chuàng)建子類 繼承父類
# class Horse(Animal):
# # 重寫run方法
# def run(self):
# print('`邁著矯健的步伐跑起來!!`')
#
# # 子類方法
# def eat(self):
# print('吃東西...')
#
#
# class SwiftHorse(Horse):
# # init初始化
# def __init__(self):
# self.name = '千里馬'
#
# # 重寫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` 類,包含初始化 init 方法:實(shí)例屬性: 名字, name年齡, age"""# 創(chuàng)建類
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. 記錄由該類創(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 類,謝謝查看!def show_info():print(f'這是一個(gè) Person 類,謝謝查看!')# 需要傳對(duì)象# def show_info(self):# print(f'這是一個(gè) {self.__class__.__name__} 類,謝謝查看!')# 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ò)誤 歡迎指出