小猿圈python之实现单例模式的两种方法

小猿圈alex讲了实现单例模式的好几种方法,小编把最经典,也是最经常用的两种实现单例模式的方法呈现给大家,如果想学其他的单例,可以去小猿圈看一下alex的课程,学习一下。

单例顾名思义就是这个类只能创建一个实例,那怎么创建呢?

1、__new__实现单例:

  class Foo(object):

  def __init__(self,name):

    self.name=name

  def __new__(cls,*args,**kwargs):

    if not hasattr(cls,instance): #对象不存在instance属性

      cls.instance=super().__new__(cls,*args,**kwargs)

    return cls.instance #创建了一个实例,还没初始化对象

f=Foo('hello')

f1=Foo('hi')

f.name=hello f1.name=hi

id(f)==id(f1)

地址没变 属性变了

2、使用装饰器实现的单例:

    class Demo(cls,*ags,**kwargs):

  instance={}

  def foo(*args,**kwargs):

    if cls not in instance:

      instance[cls]=cls(*args,**kwargs)#具体的实例(已经初始化好的实例对象)

    return instance[cls]

    return foo

@Demo

class School(object):

  def __init__(self,name)

  self.name=name

s=School('hafo')

s1=School('qinghua')

s.name=hafo s1.name=hafo s1==s

地址没变,属性也没变

朋友们看出两者实现单例的异同点了吗?虽然两者都可以实现单例,但是__new__实现的单例,虽然只能实现一个实例但是属性改变了,装饰器实现的单例,可以保证id和属性都保持一个,如果朋友们对其他的单例之间不同感兴趣,可以去小猿圈看一下alex讲的单例实现的内容。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 参考文献: 《大话设计模式》——吴强 《Python设计模式》——pythontip.com 《23种设计模式》—...
    梁林張斌阅读 2,511评论 0赞 4
  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    伊森H阅读 3,252评论 0赞 15
  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    时光清浅03阅读 589评论 0赞 0
  • 现在的孩子都在阅读名著,家长有条件可以给孩子创造更好的,这一点应该得到足够的尊重,因为时代进步了社会得到了足够的发...
    王书朋阅读 176评论 0赞 0
  • 查看网页源码和对应标签 使用QQ浏览器搜狗引擎搜索奥迪 网页爬虫示例 在gradle中引入Jsoup 相关代码
    大灰狼zz阅读 691评论 0赞 0

友情链接更多精彩内容