python单例模式数据库连接失败_Python单例模式实现方法

一 简介

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

关键点:

某个类只能有一个实例;

它必须自行创建这个实例;

它必须自行向整个系统提供这个实例。

二 实例

1 简单方法

class Singleton:

__instance = None

@classmethod

def get_instance(cls):

if cls.__instance:

return cls.__instance

cls.__instance = Singleton()

return cls.__instance

obj1 = Singleton.get_instance()

print(obj1)

obj2 = Singleton.get_instance()

print(obj2)

obj3 = Singleton.get_instance()

print(obj3)

结果:

<__main__.Singleton object at 0x7f85d7044ac8>

<__main__.Singleton object at 0x7f85d7044ac8>

<__main__.Singleton object at 0x7f85d7044ac8>

2 基于简单方法的变种1

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 Foo(Singleton):

pass

obj1 = Foo()

obj2 = Foo()

print(obj1)

print(obj2)

结果:

<__main__.Foo object at 0x7fed34a48c18>

<__main__.Foo object at 0x7fed34a48c18>

3 基于简单方法的变种2

class Singleton(object):

_state = {}

def __new__(cls, *args, **kwargs):

ob = super(Singleton, cls).__new__(cls, *args, **kwargs)

ob.__dict__ = cls._state

return ob

class Foo(Singleton):

pass

obj1 = Foo()

obj2 = Foo()

print(id(obj1.__dict__))

print(id(obj2.__dict__))

结果:

140131036531976

140131036531976

三 应用场景

由上边的实例可以看出,创建对象时,在内存中只保存一份,非常节省内存。然而,我们在什么时候会用到单例模式呢?

1. 数据库连接池

我们可以用单例模式创建一个数据库连接池,每个用户请求都可以用这个公用的数据库连接池来操作数据库。永远使用一个实例对象,从而省去了各个用户分别连接数据库时消耗的时间。

2. tornado的ioloop中的实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值