zoukankan      html  css  js  c++  java
  • 单例模式

      在函数的构造过程中,如果多个对象之间的创建值一样,为了避免内存浪费,所以使用单例模式,共用一个对象。

      如果使用以下代码则会产生2种不同地址(id值不一致)

    class Foo(object):
        def init(self):
            pass
        def process(self):
            return '123'
    
    obj1=Foo()
    obj2=Foo()
    print(id(obj1),id(obj2))

      如何让obj1和obj2拥有一个对象地址呢?

      

    class Foo(object):
        instance=None
        def __init__(self):
            self.name='PandaJ'
    
        @classmethod
        def get_instance(cls):
            if Foo.instance:
                return Foo.instance
            else:
                Foo.instance=Foo()
                return Foo.instance
    
        def process(self):
            return '123'
    
    obj1=Foo.get_instance()
    obj2=Foo.get_instance()
    print(id(obj1),id(obj2))

       这种方法使用@classmethod将函数转为类的方法可以实现obj1和obj2的地址一样,证明使用了同一个对象

      可是这样的调用方式改变了用户直接使用obj=Foo()这种方式,有没有更好的方法呢?

    class Foo(object):
        instance=None
        def __init__(self):
            self.name='PandaJ'
    
        def __new__(cls, *args, **kwargs):
    
            if Foo.instance:
                return Foo.instance
            else:
                Foo.instance = object.__new__(cls, *args, **kwargs)
                return Foo.instance
    
        def process(self):
            return '123'
    
    obj1=Foo()
    obj2=Foo()
    print(id(obj1),id(obj2))

    本方法使用new的内置函数去构造一个实例,这样的话在每次用户执行Foo()时,都会调用new函数,如果有instance则直接赋值,如果没有则生成一个instance实例,保证了单例性。

      

  • 相关阅读:
    UVALive
    UVALive
    UVA
    UVALive
    BZOJ3597 SCOI2014方伯伯运椰子(分数规划+spfa)
    BZOJ3456 城市规划(多项式求逆)
    BZOJ4182 Shopping(点分治+树形dp)
    BZOJ4383 Pustynia(线段树+拓扑排序)
    BZOJ4445 SCOI2015小凸想跑步(半平面交)
    BZOJ5311 贞鱼(动态规划+wqs二分+决策单调性)
  • 原文地址:https://www.cnblogs.com/BigJ/p/7566712.html
Copyright © 2011-2022 走看看