一、单例模式
a、单例模式分为四种:文件,类,基于__new__方法实现单例模式,基于metaclass方式实现
b、类实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Sigletion(objects):
import time
def __init__( self ):
time.sleep( 1 )
@classmethod
def instance( cls , * args, * * kwargs)
if not hasattr (Sigletion, '_instance' ):
Sigletion._instance = Sigletion( * args, * * kwargs)
return Sigletion._instance
import threading
daf task(arg):
obj = Sigletion.instance()
print (obj)
for i in range ( 10 ):
t = threading.Thread(target = task,args = [i,])
t.start()
|
c、基于__new__方法实现单例模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import time
import threading
class Singleton( object ):
_instance_lock = threading.Lock()
def __init__( self ):
pass
def __new__( cls , * args, * * kwargs):
if not hasattr (Singleton, "_instance" ):
with Singleton._instance_lock:
if not hasattr (Singleton, "_instance" ):
Singleton._instance = object .__new__( cls , * args, * * kwargs)
return Singleton._instance
obj1 = Singleton()
obj2 = Singleton()
print (obj1,obj2)
def task(arg):
obj = Singleton()
print (obj)
for i in range ( 10 ):
t = threading.Thread(target = task,args = [i,])
t.start()
|
d、基于metaclass方式实现单例模式
"""
1.对象是类创建,创建对象时候类的__init__方法自动执行,对象()执行类的 __call__ 方法
2.类是type创建,创建类时候type的__init__方法自动执行,类() 执行type的 __call__方法(类的__new__方法,类的__init__方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# 第0步: 执行type的 __init__ 方法【类是type的对象】
class Foo:
def __init__( self ):
pass
def __call__( self , * args, * * kwargs):
pass
# 第1步: 执行type的 __call__ 方法
# 1.1 调用 Foo类(是type的对象)的 __new__方法,用于创建对象。
# 1.2 调用 Foo类(是type的对象)的 __init__方法,用于对对象初始化。
obj = Foo()
# 第2步:执行Foodef __call__ 方法
obj()
"""
import threading
class SingletonType( type ):
_instace_lock = threading.Lock()
def __call__( cls , * args, * * kwargs):
if not hasattr ( cls , "_instance" ):
with SingletonType._instace_lock:
if not hasattr ( cls , "_instance" ):
cls ._instance = super (SingletonType, cls ).__call__( * args, * * kwargs)
return cls ._instance
class Foo(metaclass = SingletonType):
def __init__( self ,name):
self .name = name
obj1 = Foo( 'name' )
obj2 = Foo( 'name' )
print (obj1,obj2)
|
原文链接:https://www.cnblogs.com/mengqingjian/p/8453975.html