class Singleton(type):
def __init__(self, name, bases, dct):
super(Singleton, self).__init__(name, bases, dct)
self.instance = None
def __call__(self,*args,**kw):
if self.instance is None:
self.instance = super(Singleton, self).__call__(*args, **kw)
return self.instance
class A(object):
__metaclass__ = Singleton
def __init__(self):
self.xx = 1
A()
注解:
__metaclass__顾名思义是class A的元类,所谓元类即其实例是一个类。所以,Singleton的一个实例是class A。那么A()到底是怎样的执行过程呢?
- 1) Singleton实例化:隐式调用了Sinleton的__new__方法生成一个实例,并调用Singleton.__init__去初始化这个实例,初始化之后便产生了class A。这里,name, bases, dct就是class A的定义中的相关属性。
- 2) A的实例化,由于在Singleton中定义了__call__,即Singleton的实例可以像函数一样调用。然而,Singleton的实例是class A,根据规则,在实例化A时即A(),解释器选择调用Singleton.__call__(并不调用A.__new__和A.__init__)。那么A.__init__在何时调用呢?
- 3) 在执行Singleton.__Call__时,如果self.instance(即A.instance)是None时,则调用super(Singleton, self).__call__,在这个函数中会调用A.__init__,初始化A的实例后存在self.instance(即A.instance)中。
通过这样就可以做到只有一个A的实例,并存储在A.instance中。元类确实有点绕人,但是弄清楚了之后,它在特定的时刻能带来很大的方便。
class Singleton:
"""
A non-thread-safe helper class to ease implementing singletons.
This should be used as a decorator -- not a metaclass -- to the
class that should be a singleton.
The decorated class can define one `__init__` function that
takes only the `self` argument. Other than that, there are
no restrictions that apply to the decorated class.
To get the singleton instance, use the `Instance` method. Trying
to use `__call__` will result in a `TypeError` being raised.
Limitations: The decorated class cannot be inherited from.
"""
def __init__(self, decorated):
self._decorated = decorated
def Instance(self):
"""
Returns the singleton instance. Upon its first call, it creates a
new instance of the decorated class and calls its `__init__` method.
On all subsequent calls, the already created instance is returned.
"""
try:
return self._instance
except AttributeError:
self._instance = self._decorated()
return self._instance
def __call__(self):
raise TypeError('Singletons must be accessed through `Instance()`.')
def __instancecheck__(self, inst):
return isinstance(inst, self._decorated)
@Singleton
class Foo:
def __init__(self):
print 'Foo created'
f = Foo() # Error, this isn't how you get the instance of a singleton
f = Foo.Instance() # Good. Being explicit is in line with the Python Zen
g = Foo.Instance() # Returns already created instance
print f is g # True
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(
cls, *args, **kwargs)
return cls._instance
if __name__ == '__main__':
s1=Singleton()
s2=Singleton()
if(id(s1)==id(s2)):
print "Same"
else:
print "Different"
部分源码来自于:
http://stackoverflow.com/questions/42558/python-and-the-singleton-pattern
http://stackoverflow.com/questions/6760685/creating-a-singleton-in-python
分享到:
相关推荐
python 实现 建造者模式 python 实现 状态模式1 python 实现 状态模式2(面向过程的方式-方法版) python 实现 状态模式3(分类版) python 实现 状态模式4 python 实现 抽象工厂模式1 python 实现 抽象工厂模式2 ...
Python实现命令模式、中介者模式和解释器模式.md Python实现命令模式、中介者模式和解释器模式.md Python实现命令模式、中介者模式和解释器模式.md Python实现命令模式、中介者模式和解释器模式.md Python实现命令...
python 实现 状态模式1 python 实现 状态模式2(面向过程的方式-方法版) python 实现 状态模式3(分类版) python 实现 状态模式4
设计模式 23的 Python实现 代码用Python 3.6实现。 设计模式 23的 Python实现 代码用Python 3.6实现。 设计模式 23的 Python实现 代码用Python 3.6实现。
1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通。 2.主要针对各个计算机相关...基于多种机器学习算法的贷款中风险预测系统python实现源码(附数据集+答辩PPT)
Python 如何实现Bearer模式的Token验证 Python源码Python 如何实现Bearer模式的Token验证 Python源码Python 如何实现Bearer模式的Token验证 Python源码Python 如何实现Bearer模式的Token验证 Python源码Python 如何...
python实现自由落体功能效果实现python实现自由落体功能效果实现python实现自由落体功能效果实现python实现自由落体功能效果实现python实现自由落体功能效果实现python实现自由落体功能效果实现python实现自由落体...
python 实现 组合模式
python 实现 原型模式
python 实现 装饰模式
python 实现 适配器模式
python 实现 外观模式
python 实现 桥接模式
python 实现 命令模式
python 实现 工厂模式
python 实现 代理模式
Python实现策略模式、观察者模式和责任链模式.md Python实现策略模式、观察者模式和责任链模式.md Python实现策略模式、观察者模式和责任链模式.md Python实现策略模式、观察者模式和责任链模式.md
python实现大风车动画效果实现python实现大风车动画效果实现python实现大风车动画效果实现python实现大风车动画效果实现python实现大风车动画效果实现python实现大风车动画效果实现python实现大风车动画效果实现...
python实现23种设计模式.设计模式python语言版 C++,JAVA,flash as3版 23种设计模式,我已经都上传过了,今天上传个python版的23种设计模式
在Python中实现单例模式.docx