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__的正常執行 使得建立對象都必須通過本身判斷邏輯