单例模式:一种软件设计中经常使用的设计模式,属于创建型模式中的一种,其目的是确保类只有一个实例。
1、重写__new__方法:原理为通过一个类静态变量保存对象值,以后每次进行实例化对象时,都使用静态变量保存的对象值。
2、装饰器:原理同重新__new__方法一样
3、元类:原理同上
4、模块:利用了python加载模块时,只是第一次运行模块内容,以后都是直接使用模块.pyc文件原理
线程安全:多线程中进行单例模式的实现时,因为多线程是抢占式,因此需要加锁才能保证单例模式。
无派生类:
singleton.py
# -*- coding: utf-8 -*-
# @Author: kg
# @Date: 2019-01-03 16:06:10
# @Last Modified by: Administrator
# @Last Modified time: 2019-01-04 16:11:29
# @aim: 实现单例模式
# @env: python3.5
# 无派生类
from unittest import TestCase, main
class newSingleton():
"""重写__new__方法实现单例模式"""
_instance = None # 保存单例实例对象
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__new__(cls, *args, **kwargs)
return cls._instance
def getSingleton(cls):
"""装饰器进行类实例检查"""
def check():
if hasattr(cls, "_instance") is False:
cls._instance = cls()
return cls._instance
return check
@getSingleton
class deSingleton():
"""装饰器实现单例模式"""
pass
class metaSingleton(type):
"""元类方式实现单例模式"""
_instance = None
def __call__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__call__(*args, **kwargs)
return cls._instance
class mySingleton(metaclass=metaSingleton):
"""元类直接实例化比较复杂,所以使用额外类完成单实例对象"""
pass
class myTest(TestCase):
"""单元测试"""
def testNewSingleton(self):
a = newSingleton(