发布于2019-09-06 12:44 阅读(1019) 评论(0) 点赞(11) 收藏(4)
装饰器维护一个字典对象instances,缓存了所有单例类,只要单例不存在则创建,已经存在直接返回该实例对象。
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def singleton(cls): instances = {}
def wrapper(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls]
return wrapper
class Foo(object): pass
foo1 = Foo() foo2 = Foo()
print foo1 is foo2 |
__new__是真正创建实例对象的方法,所以重写基类的__new__方法,以此来保证创建对象的时候只生成一个实例
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__new__(cls, *args,**kwargs) return cls._instance
class Foo(Singleton): pass
foo1 = Foo() foo2 = Foo()
print foo1 is foo2 # True |
元类(参考:深刻理解Python中的元类)是用于创建类对象的类,类对象创建实例对象时一定会调用__call__
方法,因此在调用__call__
时候保证始终只创建一个实例即可,type
是python中的一个元类。
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Singleton(type): def __call__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__call__(*args,**kwargs) return cls._instance
class Foo(object): __metaclass__ = Singleton
foo1 = Foo() foo2 = Foo()
print foo1 is foo2 # True 学好python你需要一个良好的环境,一个优质的开发交流群,群里都是那种相互帮助的人才是可以的,我有建立一个python学习交流群,在群里我们相互帮助,相互关心,相互分享内容,这样出问题帮助你的人就比较多,群号是301,还有056,最后是051,这样就可以找到大神聚合的群,如果你只愿意别人帮助你,不愿意分享或者帮助别人,那就请不要加了,你把你会的告诉别人这是一种分享。
|
作者:倒车请注意
链接:https://www.pythonheidong.com/blog/article/98872/b9aa56ac133085218015/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!