单例模式

使用单例这种设计模式的原因:

  1. 当每个实例都会占用资源,而且实例初始化会影响性能,这个时候就可以考虑使用单例模式,它给我们带来的好处是只有一个实例占用资源,并且只需初始化一次;
  2. 当有同步需要的时候,可以通过一个实例来进行同步控制,比如对某个共享文件(如日志文件)的控制,对计数器的同步控制等,这种情况下由于只有一个实例,所以不用担心同步问题。

在python中,我们可以用多种方法来实现单例模式:

  

  - 使用__new__

  - 使用装饰器

  - 使用元类(metaclass)

  - 使用模块

 

- 使用__new__

 

class Test(object):
    __instance = None

    def __new__(cls, *args, **kwargs, ):
        if not Test.__instance:
            Test.__instance = object.__new__(cls, )
        return Test.__instance


obj1 = Test()
obj2 = Test()
print(id(obj1)) #46797680
print(id(obj2)) #46797680

 

 

 

- 使用装饰器

def singleton(cls):
    __instances = []

    def get_instance(*args, **kwargs):
        if cls not in __instances:
            __instances.append(cls(*args, **kwargs))
        return __instances[0]

    return get_instance


@singleton
class MyClass:
    pass


one = MyClass()
two = MyClass()

print(id(one))  # 48447472
print(id(two))  # 48447472
print(one == two)
print(one is two)
if one is two:
    print('这两个对象是同一个对象')

 

def singleton(cls):
    __instances = {} #使用字典,字典为可变数据类型

    def get_instance(*args, **kwargs):
        if cls not in __instances:
            __instances[cls] = cls(*args, **kwargs)
        return __instances[cls]

    return get_instance


@singleton
class MyClass:
    pass


one = MyClass()
two = MyClass()

print(id(one))  # 48447472
print(id(two))  # 48447472
print(one == two)
print(one is two)
if one is two:
    print('这两个对象是同一个对象')
def singleton(cls):
    instance = None  # Nonetype这个数据类型不可用

    def get_instance(*args, **kwargs):
        nonlocal instance  # 在这里要对instance进行改变(引用的非全局变量),需要进行naoloacl申明
        if not instance:
            instance = cls(*args, **kwargs)
        return instance

    return get_instance


@singleton
class MyClass:
    pass


one = MyClass()
two = MyClass()

print(id(one))  # 48447472
print(id(two))  # 48447472
print(one == two)
print(one is two)
if one is two:
    print('这两个对象是同一个对象')

posted on 2018-08-02 16:40  None——None  阅读(232)  评论(0)    收藏  举报

导航