设为首页 收藏本站
查看: 820|回复: 0

[经验分享] python实现的单子模式(附解释)

[复制链接]

尚未签到

发表于 2017-4-30 10:11:43 | 显示全部楼层 |阅读模式

  • 一、通过metaclass来实现


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中。元类确实有点绕人,但是弄清楚了之后,它在特定的时刻能带来很大的方便。

  • 二、通过decorator来实现


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



  • 三、通过__new__来实现


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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-371094-1-1.html 上篇帖子: 也谈 Python 的中文编码处理 下篇帖子: python之soap(soaplib(server),suds(client))
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表