木胖子 2020-11-17 16:44 采纳率: 100%
浏览 9
已采纳

python单例模式疑惑:

倒数第四行代码,调用后,会调用__init__函数,但是这不是单例模式的初衷(所有self数据又被重新初始化),有什么办法能防止该步骤的初始化?(像C++那样,单例模式仅在第一次调用构造函数)

class Single(object):
    _instance = None
    def __new__(cls, *args, **kw):
        if cls._instance is None:
            cls._instance = object.__new__(cls, *args, **kw)
        return cls._instance

    def __init__(self):
        self.var = 0
        print("init")

    def setVar(self, var):
        self.var = var

    def getVar(self):
        return self.var

if __name__ == '__main__':
    single1 = Single()  # log: init
    single1.setVar(1)
    print(single1.getVar()) #log: 1
    single2 = Single()  # log: init
    print(single1.getVar()) # log: 0
    print(single2.getVar()) # log: 0
    print(id(single1) == id(single2)) # log: Ture

 

  • 写回答

1条回答 默认 最新

  • 放风喽 2020-11-17 20:12
    关注

    2. 使用装饰器
    装饰器里面的外层变量定义一个字典,里面存放这个类的实例.当第一次创建的收,就将这个实例保存到这个字典中.
    然后以后每次创建对象的时候,都去这个字典中判断一下,如果已经被实例化,就直接取这个实例对象.如果不存在就保存到字典中.

    # encoding:utf-8
    __author__ = 'Fioman'
    __time__ = '2019/3/6 10:22'
    
    
    def singleton(cls):
        # 单下划线的作用是这个变量只能在当前模块里访问,仅仅是一种提示作用
        # 创建一个字典用来保存类的实例对象
        _instance = {}
    
        def _singleton(*args, **kwargs):
            # 先判断这个类有没有对象
            if cls not in _instance:
                _instance[cls] = cls(*args, **kwargs)  # 创建一个对象,并保存到字典当中
            # 将实例对象返回
            return _instance[cls]
    
        return _singleton
    
    
    @singleton
    class A(object):
        a = 1
    
        def __init__(self, x=0):
            self.x = x
            print('这是A的类的初始化方法')
    
    
    a1 = A(2)
    a2 = A(3)
    print(id(a1), id(a2))



    作者:莫辜负自己的一世韶光
    链接:https://www.jianshu.com/p/6a1690f0dd00
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line