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__的正常执行  使得建立对象都必须通过本身判断逻辑
相关文章
相关标签/搜索