您的位置:首页 > 编程语言 > Python开发

Python 设计模式 -- 单例模式

2017-06-21 17:18 281 查看

Python 单例模式

单例模式的意思是在同一个运行环境中一个进程里面,这个类的实例只有一份,该实例也只会初始化一次。

python 语言的单例模式至少可以有4种实现方式:

1.使用
__new__
构造函数:

class Singleton(object):
__instance = None
def __new__(cls, *argv, **kwags):
if Singleton.__instance is None:
Singleton.__instance = object.__new__(cls, *argv, **kwags)
return Singleton.__instance

class MyFoo(Singleton):
pass

f1 = MyFoo()
f2 = MyFoo()
print f1
print f2

>><__main__.MyFoo object at 0x7fd9f2a96110>
<__main__.MyFoo object at 0x7fd9f2a96110>


2.使用python装饰器实现:

def singleton(cls):
__instance = {}
def _singleton(*argv, **kwags):
if cls not in __instance:
__instance[cls] = cls(*argc, **kwags)
return __instance[cls]
return _singleton

@singleton
class MyFoo(object):
def __init__(self, age):
self.age = age

f1 = MyFoo(12)
f2 = MyFoo(13)
print f1
print f2
print f1.age
print f2.age

>><__main__.MyFoo object at 0x7fab563f4150>
<__main__.MyFoo object at 0x7fab563f4150>
12
12


3.使用import的方式:

#mySingleClass.py
class MySingleClass(object):
def __init__(self):
pass

single_instance = MySingleClass()

#test.py
def func1():
from mySingleClass import single_instance
print(single_instance)
def func2():
from mySingleClass import single_instance
print(single_instance)

func1()
func2()

>><mySingleClass.MySingleClass object at 0x7f13fa14e210>
<mySingleClass.MySingleClass object at 0x7f13fa14e210>


4.共享属性:

创建实例时把所有实例的
__dict__
指向同一个字典,这样它们具有相同的属性和方法.

这种方式和前面3种方式并不能相提并论,我觉得它根本没有实现正真意义上的单例,因为它实例化的时候创建的是id不同的实例,虽然指向了相同的
__dict__
。不推荐这种方式,有误导性。

class Singleton(object):
__global_dict = {}
def __new__(cls, *args, **kwags):
__instance = object.__new__(cls, *args, **kwags)
__instance.__dict__ = Singleton.__global_dict
return __instance

class MyFoo(Singleton):
def __init__(self, name):
self.name = name

f1 = MyFoo("Python")
f2 = MyFoo("Java")
print(f1)
print(f2)
print f1.name
print f2.name

>><__main__.MyFoo object at 0x7fdc1315c350>
<__main__.MyFoo object at 0x7fdc1315c390>
Java
Java
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: