Python-元類 單例

2.元類    用於建立類的類 叫元類   默認元類都是type    主要控制類的建立__init__   類的實例化__call__3.單例    一個類只有一個實例    何時用,你們公用一個打印機,沒有必要每一個人建立新的打印機對象 共用一個對象便可===============================元類是什麼?    源自一句話:在python中,一切皆對象,而對象都是由類實例化獲得的    本質上元類也是一個類,元類是用於實例化其餘類class Dog:    def __init__(self):        print("狗初始化了")    color = "red"    def talk(self):        print("狗在叫!")d1 = Dog()# print(Dog.__dict__)# 查看對象時哪一個類實例化出來的print(d1.__class__) #<class '__main__.Dog'>print(Dog.__class__) #<class 'type'>print(type(d1))  #<class '__main__.Dog'>print(type(Dog)) #<class 'type'># 一個類必須具有的內容    1.類名    2.基類    3.名稱空間#經過查看__class__ 發現 Dog對象 是由type類示例化得來#既然如此 是否是能夠手動調用type來實例化class_name = "Pig"bases = (object,)pic_dict = {}class_body = """def __init__(self):    print("豬初始化了")color = "red"def talk(self):    print("豬在叫!")"""# 執行一堆字符串代碼  將生產的內容放到pic_dict中exec(class_body,{},pic_dict)print(pic_dict)# 調用type產生一個類c = type(class_name,bases,pic_dict)print(c)  #<class '__main__.Pig'>print(Dog) #<class '__main__.Dog'>"""    默認狀況下  全部的類都是經過type這個元類示例化的    咱們徹底能夠本身來實例化    元類的做用?    用於建立類的類 稱爲元類"""# 控制類的建立過程 核心函數就是元類中的init函數    # 1.控制類的調用    # 2.單例設計模式# 調用一個類的建立   建立出一個空對象,調用__init__來完成對象的初始化,返回該對象# 控制類的調用 也就是實例化過程    核心函數 元類中的__call__    # 須要注意的是,在__call__中應當先完成基礎的邏輯        1.建立空對象,2.執行__init__ 3.返回新對象    # 在此基礎上添加額外的業務邏輯單例    是一種設計模式    是設計模式中比較簡單的    指的是 一個類有且僅有一個實例 就叫單例    實現單例 就經過判斷是否已經建立過對象爲何要使用單例這種模式    以前在建立對象時 每一個對象中的數據不相同   對象實際上數據和處理數據的方法的結合體    當對象中的數據是 相同的 共享的 時候 使用單例u1 = user("張三",29,"man")u2 = user("張三",29,"man")u3 = user("張三",29,"man")不一樣的對象 有徹底相同的數據  沒有必要每一個人保存一份u1 = user("張三",29,"man")u2 = u1u3 = u1如此  能夠減小資源開銷  你們共享一個數據 只有一個對象 單例模板!!!class MyMetaClass(type):    instance = None    def __call__(cls, *args, **kwargs):        if not MyMetaClass.instance:            # 建立空對象            MyMetaClass.instance = object.__new__(cls)            print("建立新的播放器對象!")            #初始化對象            MyMetaClass.instance.__init__(*args,**kwargs)            # 返回對象        return MyMetaClass.instance# 只能有一個播放器實例class CDPlayer(metaclass=MyMetaClass):    def play(self,music):        print("切換音樂",music)    def __init__(self,music_name):        self.music_name = music_namep1 = CDPlayer("你發如雪!")p1.play("菊花臺")p1.play("菊花臺2")p1.play("菊花臺3")# 不會建立新對象p1 = CDPlayer("你發如雪!")p1 = CDPlayer("你發如雪!")p1 = CDPlayer("你發如雪!")p1 = CDPlayer("你發如雪!")# 元類實現單例 就是攔截了元類中的__call__的正常執行  使得建立對象都必須通過本身判斷邏輯
相關文章
相關標籤/搜索