单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
__new__()在__init__()之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。单例模式是指创建唯一对象,单例模式设计的类只能实例
1 使用__new__方法
[Python] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
|
class Singleton( object ):
def __new__( cls , * args, * * kw):
if not hasattr ( cls , '_instance' ):
orig = super (Singleton, cls )
cls ._instance = orig.__new__( cls , * args, * * kw)
return cls ._instance
class MyClass(Singleton):
a = 1
|
2 共享属性
创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法.
[Python] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
|
class Borg( object ):
_state = {}
def __new__( cls , * args, * * kw):
ob = super (Borg, cls ).__new__( cls , * args, * * kw)
ob.__dict__ = cls ._state
return ob
class MyClass2(Borg):
a = 1
|
3 装饰器版本
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
|
def singleton( cls ):
instances = {}
def getinstance( * args, * * kw):
if cls not in instances:
instances[ cls ] = cls ( * args, * * kw)
return instances[ cls ]
return getinstance
@singleton
class MyClass:
...
|
4 import方法
作为python的模块是天然的单例模式
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
|
# mysingleton.py
class My_Singleton( object ):
def foo( self ):
pass
my_singleton = My_Singleton()
# to use
from mysingleton import my_singleton
my_singleton.foo()
|
参考自----https://github.com/taizilongxu/interview_python