本文实例讲述了Python单体模式的几种常见实现方法。分享给大家供大家参考,具体如下:
这里python实现的单体模式,参考了:https://*.com/questions/1363839/python-singleton-object-instantiation/1363852#1363852
一、修改父类的 __dict__
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Borg:
_shared_state = {}
def __init__( self ):
self .__dict__ = self ._shared_state
class Singleton(Borg):
def __init__( self , name):
super ().__init__()
self .name = name
def __str__( self ):
return self .name
x = Singleton( 'sausage' )
print (x)
y = Singleton( 'eggs' )
print (y)
z = Singleton( 'spam' )
print (z)
print (x)
print (y)
|
注意,这种方法实现的并非真正的单体模式!!
下面几种方法实现的才是真正的单体模式
二、使用元类
先看看这里关于元类的描述:
元类一般用于创建类。
在执行类定义时,解释器必须要知道这个类的正确的元类。解释器会先寻找类属性__metaclass__
,如果此属性存在,就将这个属性赋值给此类作为它的元类。如果此属性没有定义,它会向上查找父类中的__metaclass__
。如果还没有发现__metaclass__
属性,解释器会检查名字为__metaclass__
的全局变量,如果它存在,就使用它作为元类。否则, 使用内置的 type 作为此类的元类。
1. 继承 type,使用 __call__
注意__call__
的参数
1
2
3
4
5
6
7
8
9
10
|
class Singleton( type ):
_instance = None
def __call__( self , * args, * * kw):
if self ._instance is None :
self ._instance = super ().__call__( * args, * * kw)
return self ._instance
class MyClass( object ):
__metaclass__ = Singleton
print (MyClass())
print (MyClass())
|
2. 继承 type,使用 __new__
注意__new__
的参数
1
2
3
4
5
6
7
8
9
10
|
class Singleton( type ):
_instance = None
def __new__( cls , name, bases, dct):
if cls ._instance is None :
cls ._instance = super ().__new__( cls , name, bases, dct)
return cls ._instance
class MyClass( object ):
__metaclass__ = Singleton
print (MyClass())
print (MyClass())
|
3. 继承 object
,使用 __new__
注意__new__
的参数
1
2
3
4
5
6
7
8
9
10
|
class Singleton( object ):
_instance = None
def __new__( cls ):
if cls ._instance is None :
cls ._instance = super ().__new__( cls )
return cls ._instance
class MyClass( object ):
__metaclass__ = Singleton
print (MyClass())
print (MyClass())
|
下面还有一个很巧妙的方法实现单体模式
使用类方法classmethod
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Singleton:
_instance = None
@classmethod
def create( cls ):
if cls ._instance is None :
cls ._instance = cls ()
return cls ._instance
def __init__( self ):
self .x = 5 # or whatever you want to do
sing = Singleton.create()
print (sing.x) # 5
sec = Singleton.create()
print (sec.x) # 5
|
希望本文所述对大家Python程序设计有所帮助。