python 单例之多种方法

1.__new__方法

class Son(object):

    __instance = None

   

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

        if not cls.__instance:

            cls.__instance = object.__new__(cls)

        return cls.__instance

a =Son()

b =Son()

print(id(a))

print(id(b))


2.装饰器方法

def pro(class_):

    info = {}

    def wrappend(*args,**kwargs):

        if class_ not in info:

            info[class_] = class_(*args,**kwargs)

        return info[class_]

    return wrappend

@pro

class Foo():

    pass

a = Foo()

b = Foo()

print(id(a))

print(id(b))


3.类装饰器方法


class Son(object):

    __instance = None

   

    def __init__(self,class_):

        self.class_ = class_

   

    def __call__(self,*args,**kwargs):

        if not Son.__instance:

            Son.__instance = self.class_(*args,**kwargs)

        return Son.__instance

   

@Son

class Foo(object):

    pass

b1 = Foo()

b2 = Foo()

print(id(b1))

print(id(b2))

4.元类方法

class UpperAttrMetaClass(type):

    # init方法也可以实现

    def __init__(self,*args,**kwargs):

        self._instance = None

        type.__init__(*args,**kwargs)

    # new方法可以实现

    #def __new__(cls,class_name,class_parents,class_attr):

    #    class_attr['_instance'] = None

    #    return type.__new__(cls,class_name,class_parents,class_attr)

       

    #    # 下边这个不可取

    #    #return type(class_name,class_parents,class_attr)

   

    def __call__(self,*args,**kwargs):

        if not self._instance:

            self._instance = super().__call__(*args,**kwargs)

        return self._instance

# 在代码执行到class FOO这里的时候 元类的__new__方法 和 __init__方法其实已经被执行

class Foo(object,metaclass=UpperAttrMetaClass):

    pass

f1 = Foo()

f2 = Foo()

print(id(f1))

print(id(f2))

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

相关阅读更多精彩内容

  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 9,709评论 4 16
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,107评论 19 139
  • 看到阿韬老弟给女儿的家书被感动了!阿韬是将军之子,又是大老总,在朋友圈里很有重量。而在女儿面前的柔情让我对他更敬重...
    慧好聊吧阅读 1,634评论 1 1
  • 五 大四了,很多人都开始实习了,小黑也找了一个工作干着,挣点零花钱。上班第一天,端正的电话就打过来了。 “干嘛呢?...
    瑊玏阅读 2,372评论 0 0
  • 文/Nichole 文学/情感 我做了个花架。 第一天,把一把梯子,用碎花布将架子边缠起来。 第二天,买了好几盆肉...
    翁萍阅读 1,733评论 0 0

友情链接更多精彩内容