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__的正常执行 使得建立对象都必须通过本身判断逻辑