zoukankan      html  css  js  c++  java
  • 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 = u1
    u3 = 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__的正常执行 使得创建对象都必须经过自己判断逻辑
  • 相关阅读:
    juc原子类之五:AtomicLongFieldUpdater原子类
    DICOM:C-GET与C-MOVE对照剖析
    android createbitmap函数内存溢出,求解怎样进行处理out of memory溢出问题
    TRIZ系列-创新原理-32-改变颜色原理
    FP-Growth算法之频繁项集的挖掘(python)
    个人年终总结
    J2EE之ANT
    log4net 使用与配置 每天一份log文件
    Android 完美实现图片圆角和圆形(对实现进行分析)
    Unity3d修炼之路:载入一个预制体,然后为该对象加入组件,然后查找对象,得到组件。
  • 原文地址:https://www.cnblogs.com/du-jun/p/10029086.html
Copyright © 2011-2022 走看看