• python:单例模式--使用__new__(cls)实现


    单例模式:即一个类有且仅有一个实例。

    那么通过python怎么实现一个类只能有一个实例呢。

    class Earth:
        """
        假如你是神,你可以创造地球
        """
        print '欢迎来到地球'
    
    # 生成一个地球
    a = Earth()
    print id(a)
    
    # 再生成一个地球
    b = Earth()
    print id(b)

    输出:

    欢迎来到地球
    53356616
    59869960

    从上面例子可以看到,地球被创建了两次,因为地球只能有一个,所以Earth类只能有一个实例,所以需要单例模式实现。

    python中,一个类创建对象实例是通过调用父类object的 __new__(cls)方法来创建对象的

    我们可以通过重写 __new__(cls)方法去实现类只创建一个实例,再创建的实例返回上一次的对象的引用。

    class Earth(object):
        """
        假如你是神,你可以创造地球
        """
        # 定义一个类属性做判断
        instance = None
    
        def __new__(cls, *args, **kwargs):
            # 如果instance为空则说明是第一次创建实例
            # 通过父类的__new__(cls)创建实例
            if cls.instance == None:
                # 调用父类的__new__(cls)方法创建实例,并将该实例赋值给类变量instance,此时该变量的值从None变为该实例
                cls.instance = object.__new__(cls)
                # print cls.instance
                # 返回实例化对象
                return cls.instance
            else:
                # 返回上一个对象的引用
                return cls.instance
    
        # print '欢迎来到地球'
    
    
    print '原始的instance值为:%s' % Earth.instance
    
    # 生成一个地球
    a = Earth()
    # 创建实例后的instance值
    print '创建实例后的instance值为:%s' % Earth.instance
    print id(a)
    
    # 再生成一个地球
    b = Earth()
    print id(b)

    输出:

    原始的instance值为:None
    创建实例后的instance值为:<__main__.Earth object at 0x0000000003090E10>
    50925072
    50925072

    可以看到两次的id相同,为同一个对象

    参考:https://blog.csdn.net/CtyCt_/article/details/79677125

    多种实现单例模式:https://www.cnblogs.com/huchong/p/8244279.html

  • 相关阅读:
    判断是否为蜘蛛抓取
    js Date
    JavaScript_Date对象说明
    php过滤字符串函数
    js 高考倒计时
    php 修改数据编码
    php 二维数组冒泡排序
    PSD网页切图制作HTML全过程教程
    产品经理职责
    互联网产品设计
  • 原文地址:https://www.cnblogs.com/gcgc/p/11585444.html
Copyright © 2020-2023  润新知