单例模式(Singleton Pattern)是一种经常使用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你但愿在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。git
好比,某个服务器程序的配置信息存放在一个文件中,客户端经过一个 AppConfig 的类来读取配置文件的信息。若是在程序运行期间,有不少地方都须要使用配置文件的内容,也就是说,不少地方都须要建立 AppConfig 对象的实例,这就致使系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤为是在配置文件内容不少的状况下。事实上,相似 AppConfig 这样的类,咱们但愿在程序运行期间只存在一个实例对象。github
在 Python 中,咱们能够用多种方法来实现单例模式:设计模式
__new__
其实,Python 的模块就是自然的单例模式,由于模块在第一次导入时,会生成 .pyc
文件,当第二次导入时,就会直接加载 .pyc
文件,而不会再次执行模块代码。所以,咱们只需把相关的函数和数据定义在一个模块中,就能够得到一个单例对象了。若是咱们真的想要一个单例类,能够考虑这样作:服务器
将上面的代码保存在文件 mysingleton.py
中,而后这样使用:函数
__new__
为了使类只能出现一个实例,咱们可使用 __new__
来控制实例的建立过程,代码以下:设计
在上面的代码中,咱们将类的实例和一个类变量 _instance
关联起来,若是 cls._instance
为 None 则建立实例,不然直接返回 cls._instance
。3d
执行状况以下:code
咱们知道,装饰器(decorator)能够动态地修改一个类或函数的功能。这里,咱们也可使用装饰器来装饰某个类,使其只能生成一个实例,代码以下:对象
在上面,咱们定义了一个装饰器 singleton
,它返回了一个内部函数 getinstance
,该函数会判断某个类是否在字典 instances
中,若是不存在,则会将 cls
做为 key,cls(*args, **kw)
做为 value 存到 instances
中,不然,直接返回 instances[cls]
。blog
元类(metaclass)能够控制类的建立过程,它主要作三件事:
使用元类实现单例模式的代码以下: