1.  
  2. 2.元类
    用于创建类的类 叫元类 默认元类都是type
    主要控制类的创建__init__ 类的实例化__call__
  3.  
  4. 3.单例
    一个类只有一个实例
    什么时候用,大家公用一个打印机,没有必要每个人创建新的打印机对象 共用一个对象即可
  5.  
  6. ===============================
  7.  
  8. 元类是什么?
    源自一句话:在python中,一切皆对象,而对象都是由类实例化得到的
    本质上元类也是一个类,元类是用于实例化其他类
  9.  
  10. class Dog:
    def __init__(self):
    print("狗初始化了")
    color = "red"
    def talk(self):
    print("狗在叫!")
    d1 = Dog()
    # print(Dog.__dict__)
  11.  
  12. # 查看对象时哪个类实例化出来的
    print(d1.__class__) #<class '__main__.Dog'>
    print(Dog.__class__) #<class 'type'>
    print(type(d1)) #<class '__main__.Dog'>
    print(type(Dog)) #<class 'type'>
  13.  
  14. # 一个类必须具备的内容
    1.类名
    2.基类
    3.名称空间
  15.  
  16. #通过查看__class__ 发现 Dog对象 是由type类示例化得来
    #既然如此 是不是可以手动调用type来实例化
  17.  
  18. class_name = "Pig"
    bases = (object,)
    pic_dict = {}
    class_body = """
    def __init__(self):
    print("猪初始化了")
  19.  
  20. color = "red"
  21.  
  22. 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.单例设计模式
  23.  
  24. # 调用一个类的创建 创建出一个空对象,调用__init__来完成对象的初始化,返回该对象
    # 控制类的调用 也就是实例化过程 核心函数 元类中的__call__
    # 需要注意的是,在__call__中应当先完成基础的逻辑
    1.创建空对象,2.执行__init__ 3.返回新对象
    # 在此基础上添加额外的业务逻辑
  25.  
  26. 单例
    是一种设计模式
    是设计模式中比较简单的
    指的是 一个类有且仅有一个实例 就叫单例
  27.  
  28. 实现单例 就通过判断是否已经创建过对象
  29.  
  30. 为什么要使用单例这种模式
    之前在创建对象时 每个对象中的数据不相同 对象实际上数据和处理数据的方法的结合体
    当对象中的数据是 相同的 共享的 时候 使用单例
  31.  
  32. u1 = user("张三",29,"man")
    u2 = user("张三",29,"man")
    u3 = user("张三",29,"man")
    不同的对象 有完全相同的数据 没有必要每个人保存一份
  33.  
  34. u1 = user("张三",29,"man")
    u2 = u1
    u3 = u1
    如此 可以减少资源开销 大家共享一个数据 只有一个对象
  35.  
  36. 单例模板!!!
    class MyMetaClass(type):
  37.  
  38. 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
  39.  
  40. # 只能有一个播放器实例
    class CDPlayer(metaclass=MyMetaClass):
    def play(self,music):
    print("切换音乐",music)
    def __init__(self,music_name):
    self.music_name = music_name
  41.  
  42. p1 = CDPlayer("你发如雪!")
    p1.play("菊花台")
    p1.play("菊花台2")
    p1.play("菊花台3")
  43.  
  44. # 不会创建新对象
    p1 = CDPlayer("你发如雪!")
    p1 = CDPlayer("你发如雪!")
    p1 = CDPlayer("你发如雪!")
    p1 = CDPlayer("你发如雪!")
  45.  
  46. # 元类实现单例 就是拦截了元类中的__call__的正常执行 使得创建对象都必须经过自己判断逻辑

Python-元类 单例的更多相关文章

  1. 29 内置方法 eval | exec 元类 单例

    eval与exec内置方法 将字符串作为执行目标,得到响应结果 eval常用作类型转换:该函数执行完有返回值 exec拥有执行更复杂的字符串:可以形成名称空间 eval内置函数的使用场景:   1.执 ...

  2. Python中的单例设计

    01. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案 使用 设计模式 是为了可重用代码.让代码更容易被他人理解.保 ...

  3. Python 元类 - Metaclasses

    Python 元类 - Metaclasses 默认情况下儿, classes 是有 type() 构造的. 类的结构体在一个新的 namespace 被执行, 类的名字 class name 绑定( ...

  4. python元类:type和metaclass

    python元类:type和metaclass python中一切皆对象,所以类本身也是对象.类有创建对象的能力,那谁来创建类的呢?答案是type. 1.用tpye函数创建一个类 class A(ob ...

  5. java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作

    ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...

  6. Python进阶丨如何创建你的第一个Python元类?

    摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...

  7. python中的单例

    使用__new__ 因为一个类每一次实例化的时候,都会走它的__new__方法.所以我们可以使用__new__来控制实例的创建过程,代码如下: class Single: instance = Non ...

  8. 转--python 中写单例

    原文地址 原文地址2 Python中的单例模式的几种实现方式的及优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法 ...

  9. Python元类(metaclass)以及元类实现单例模式

    这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译. 一.理解类也是对 ...

随机推荐

  1. PD915温度太高,通过设置BIOS降底CPU的核心电压来降温。

    由于对电脑配置不是很懂,去年去配了台电脑,用的CPU是PD915,不用不知道,一用吓一跳. PD915在冬天的时候,运行起来温度大概在30多度,感觉很正常. 可是一到了夏天,温度就升到了70到80度之 ...

  2. kindeditor上传图片的大小在哪控制

    请修改修改了multiimage.js 的imageSizeLimit = K.undef(self.imageSizeLimit, '3MB') 大小设置级可以

  3. 2.如何导入Spring约束?

    前言:之前在学习约束的时候,关于导入约束一直迷茫,今天详细的截图一下,以下图为例 第一步: 新建 第二步: 第三步: 第四步: 第五步:(这里写的有点小错误,是第三个) 第六步: 然后点击OK 最后的 ...

  4. 获取天气预报API

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  5. Vagrant工具的安装

    Vagrant工具的安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 这篇博客源于我的北京一位好友:崔佳.在此,为了感激崔佳的帮助,特意写下这篇博客.希望对一些开发的小伙伴有些帮 ...

  6. python---ORM之SQLAlchemy(4)relationship多对多练习

    练习一:朋友 import sqlalchemy from sqlalchemy import create_engine from sqlalchemy import Column, String, ...

  7. javascript 体验定时器

    <script> // setInterval():循环定时器,循环执行 // setTimeout():炸弹定时器,只执行一次 //定义方法1:匿名函数 setInterval(func ...

  8. 单例设计模式Singleton之懒加载模式(懒汉模式)【原】

    单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...

  9. HDU - 5419 Victor and Toys(组合计数)

    http://acm.hdu.edu.cn/showproblem.php?pid=5419 题意 n个物品,标号1-n,物品i有权值wi.现在有m个区间[l,r],从中任意选三个区间i,j,k,求物 ...

  10. Gym - 100269F Flight Boarding Optimization(dp+树状数组)

    原题链接 题意: 现在有n个人,s个位置和你可以划分长k个区域你可以把s个位置划分成k个区域,这样每个人坐下你的代价是该区域内,在你之前比你小的人的数量问你怎么划分这s个位置(当然,每个区域必须是连续 ...