Python 单例模式

1,单例模式的定义

  单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

2,单例模式的应用场景

  • 需要频繁的进行创建和销毁的对象;
  • 创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
  • 工具类对象;
  • 频繁访问数据库或文件的对象。

3,单例模式模式实现方式

  1. 利用__new__方法

# 第一种 __new__
class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = object.__new__(cls)

            return cls._instance
        else:
            return cls._instance


class MyClass(Singleton):
    a = 1


a = MyClass()
b = MyClass()
print(a.a)
print(b.a)

  另一种写法

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            orig = super(Singleton, cls)
            cls._instance = orig.__new__(cls, *args, **kwargs)
        return cls._instance

class MyClass(Singleton):
    a = 123

ret = MyClass()
print(ret.a)

 

2,共享属性 :创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法.

class Singleton(object):
    _data = {}

    def __new__(cls, *args, **kwargs):
        ob = super(Singleton, cls).__new__(cls, *args, **kwargs)
        ob.__dict__ = cls._data
        return ob


class MyClass2(Singleton):
    b = 3


b = MyClass2()
print(b.b)

  3, 装饰器版本

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(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age


c = MyClass("yu", 33)
d = MyClass('ad', 88)
print(c, d)
View Code

  4, import 方法  作为python的模块是天然的单例模式

 

posted @ 2019-03-14 21:03  大叔级别  阅读(153)  评论(0编辑  收藏  举报