单例模式
使用单例这种设计模式的原因:
- 当每个实例都会占用资源,而且实例初始化会影响性能,这个时候就可以考虑使用单例模式,它给我们带来的好处是只有一个实例占用资源,并且只需初始化一次;
- 当有同步需要的时候,可以通过一个实例来进行同步控制,比如对某个共享文件(如日志文件)的控制,对计数器的同步控制等,这种情况下由于只有一个实例,所以不用担心同步问题。
在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) 收藏 举报
浙公网安备 33010602011771号