Python教程8
Python教程8
1.多態
# -*-coding:utf-8-*- """ 1.封裝:根據職責將屬性和方法封裝到一個抽象的類中 2.繼承:實現代碼重用,相同的代碼不需要重復編寫 3.多態:不同的子類對象調用相同的父類方法,產生不同的執行結果 (多態可以增加代碼的靈活度,以繼承和重寫父類方法為前提,是調用方法的技巧 不影響到類的內部設計)"""class Dog(object):def __init__(self, name):self.name = namedef game(self):print("%s 蹦蹦跳跳的玩耍" % self.name)class XiaoTianDog(Dog):def game(self):print("%s 飛到天上去玩耍" % self.name)class Person(object):def __init__(self, name):self.name = namedef game_with_dog(self, dog):print("%s 和%s 一起玩耍----" % (self.name, dog.name))dog.game()# 創建狗對象 # waicai =Dog("旺財") waicai = XiaoTianDog("旺財1") # 創建人對象 xm = Person("小明") # 調用和人玩的方法 xm.game_with_dog(waicai)""" 術語: 創建出來的對象叫做類的實列 創建對象的動作叫實例化 對象的屬性叫做實例屬性 對象的調用方法叫做實例方法 兩個說明: 1.每個對象都有自己獨立的內存空間,保存各種不同的屬性 2.每個對象的方法,在內存中只有一份, 在調用方法時,需要把對象的引用傳遞到方法的內部 """# 類對象 """ 類時一個特殊的對象,程序運行時,類同樣會加載到內存。類對象在內存中只有一份, 使用一個類可以創建很多個對象實例,類對象還可以擁有自己的屬性和方法。 類屬性就是給類對象中定義的屬性,通常用來記錄這個類的相關特征,類屬性不會用于記錄劇吐的對象特征 """# 實例,定義一個工具類,每件工具都有自己的name,需求,指定使用這個類,創建多少個工具對象 class Tool(object):# 使用賦值語句定義類的屬性count = 0def __init__(self, name):self.name = nameTool.count += 1 # 每次調用初始化方法都加1 tool1 = Tool("斧頭") print(Tool.count) tool2 = Tool("榔頭") tool3 = Tool("扳手") print(Tool.count) print("----屬性獲取機制----") print(Tool.count) # 推薦 print("工具對象的總數: %d" % tool1.count) # (不推薦) print("工具對象的總數: %d" % tool3.count) # (不推薦) # 注意下三行 tool3.count = 99 # 在對象中找不到count屬性,則會自動添加一個。和類屬性不一樣 print("工具對象的總數: %d" % tool3.count) print("=====> %d" % Tool.count)""" 類方法: 類方法需要修飾器@classmethod來標識 類方法的第一個參數是cls """class Tool1(object):count1 = 10@classmethod # 創建類方法,方法上方使用@classmethoddef show_tool_count(cls):print("工具對象的數量%d" % cls.count1)def __init__(self, name):self.name1 = nameTool1.count1 += 1toola = Tool1("斧頭") toola = Tool1("斧頭1") Tool1.show_tool_count() # 調用類方法""" 靜態方法: 在開發時,如果需要在類中封裝一個方法: 1.不需要訪問實列屬性或者調用實例方法 2.不需要訪問類的屬性或者調用類的方法 可以把方法封裝成一個靜態的方法"""class Dog1(object):@staticmethod # 定義靜態方法,在方法上使用@staticmethoddef run(): # 注意靜態方法沒有參數print("小狗要跑跑....")# dog1 = Dog1() #調用靜態方法可以不創建對象 Dog1.run()? 2.綜合案列
# -*-coding:utf-8-*- """ 需求: 1.設計Game類 2.屬性:定義一個類屬性top_score記錄游戲的歷史最高分定義一個實例屬性player_name記錄當前游戲玩家姓名 3.方法:靜態方法show_help顯示游戲幫助信息類方法show_top_score顯示歷史最高分實列方法start_game開始當前玩家游戲 4.步驟 1.查看幫助信息 2.查看歷史最高分 3.創建游戲對象,開始游戲 """class Game(object):top_score = 0def __init__(self, name):self.player_name = name@staticmethoddef show_help():# 幫助信息print("------幫助信息--讓僵死進入大門-----")@classmethoddef show_top_score(cls):# 顯示歷史最高分print("顯示歷史記錄最高分%d" % cls.top_score)def start_game(self):# 開始當前玩家游戲print("[%s]開始游戲啦.....!" % self.player_name)# 1.查看游戲幫助信息 Game.show_help() # 2.查看歷史最高分 Game.show_top_score() # 3.創建游戲對象 game = Game("小明") game.start_game()"""" 幾點說明: 1.實例方法--方法內部只需要訪問實例屬性(實例方法內部可以使用類名.訪問類屬性---同時訪問實例屬性和類屬性) 2.類方法--方法內部只訪問類屬性 3.靜態方法--方法內部,不需要訪問實例屬性和類屬性 """? 3.單例模式:
# -*-coding:utf-8-*- """ 單例設計模式: 設計模式:時前人工作的總結和提煉,通常被人們廣泛流傳的設計模式都是針對某一特定問題的成熟解決方案 單例設計模式:讓類創建對象,在系統中只有唯一的一個實例。每次執行類名()返回對象,內存地址都是相同的 場景:音樂播放對象回收站對象打印機對象 """ """ __new__方法: 1.在使用類名()創建對象時,python解釋器會首先調用__new__方法為對象分配空間,返回對象的引用 2.獲取對象的引用后,將引用作為第一個參數,傳遞給__init__方法重寫__new__方法的代碼非常固定:重寫__nw__方法一定要return super().__new__(cls),否則解釋器得不到分配空間對象的引用,就不會電泳對象的初始化方法,其中__new__時一個靜態的方法,在調用的時需要主動傳遞cls參數 """# __new__方法的重寫 class MusicPlayer(object):def __new__(cls, *args, **kwargs):# 創建對象時,new方法會自動調用print("創建對象,分配空間")# 為對象分配空間instance = super().__new__(cls) # 調用的父類方法# 返回對象的引用return instancedef __init__(self):print("播放器初始化")# 創建播放器對象 player = MusicPlayer() print(player)# 單列演示,不管創建多個對象,其對象的引用都是一樣 print("單列演示,不管創建多個對象,其對象的引用都是一樣-----")class MusicPlayer1(object):# 定義類屬性,記住第一個被創建的對象引用instance = None# 定義類屬性,記錄是否初始化動作init_flag = Falsedef __new__(cls, *args, **kwargs):# 判斷類屬性是否為空if cls.instance is None:# 調用父類的方法,為第一個對象分配空間cls.instance = super().__new__(cls)# 返回類屬性保存的引用return cls.instancedef __init__(self):# 判斷是否執行過初始動作if MusicPlayer1.init_flag:return# 如果沒有,則執行初始化print("初始化動作")# 修改屬性的標記MusicPlayer1.init_flag = True# 創建對象 player1 = MusicPlayer1() print(player1) player2 = MusicPlayer1() print(player2) # 創建了兩次對象,雖然返回對象的引用時一個值,但使用一次類()創建對象,則初始化執行一次 # 同樣我們可以設置初始化標記。?
轉載于:https://www.cnblogs.com/jun1/p/9941690.html
總結
- 上一篇: svn checkout 报svn:ur
- 下一篇: Ubuntu 编译安装python3.7