美文网首页大数据 爬虫Python AI Sql小猿圈-IT自学人的小圈子
小猿圈学习python之实现单例模式的两种方法

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

作者: f673630174f6 | 来源:发表于2019-06-19 16:49 被阅读0次

    小猿圈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和属性都保持一个,如果朋友们对其他的单例之间不同感兴趣Python交流群:242719133,可以去小猿圈看一下alex讲的单例实现的内容。

    相关文章

      网友评论

        本文标题:小猿圈学习python之实现单例模式的两种方法

        本文链接:https://www.haomeiwen.com/subject/hcgkqctx.html