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_name p1 = CDPlayer("你发如雪!")p1.play("菊花台")p1.play("菊花台2")p1.play("菊花台3") # 不会创建新对象p1 = CDPlayer("你发如雪!")p1 = CDPlayer("你发如雪!")p1 = CDPlayer("你发如雪!")p1 = CDPlayer("你发如雪!") # 元类实现单例 就是拦截了元类中的__call__的正常执行 使得创建对象都必须经过自己判断逻辑
原文地址:https://www.cnblogs.com/du-jun/p/10029086.html
时间: 2024-10-09 09:37:31