单例模式-python

单例模式

什么是单例

当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例

有什么优点

在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。

避免对资源的多重占用(比如写文件操作)。

python单例模式的4种实现

模块

利用了模块的特性,只执行一次

bl.py

class zx():
    pass
z=zx()
import dl
dl.z
print(dl.z)
import dl
dl.z
print(dl.z)
<dl.zx object at 0x000002517F5CDD30>
<dl.zx object at 0x000002517F5CDD30>

装饰器

def outter(cls):
    zx=cls()
    def inner():
        return zx
    return inner

@outter          #wl=outter(wl)
class wl():
    pass

z1=wl()
z2=wl()

print(z1)
print(z2)
<__main__.wl object at 0x000002155202BDD8>
<__main__.wl object at 0x000002155202BDD8>

类属性

class haha():
    pass

class zx():
    obj=None
    def set_obj(self):
        zx.obj=haha()

    def get_obj(self):
        return self.obj

zx1=zx()
zx1.set_obj()
z1=zx()
z2=zx()
print(z1.get_obj())
print(z2.get_obj())
<__main__.haha object at 0x000001D78238DDA0>
<__main__.haha object at 0x000001D78238DDA0>

元类

class haha():
    pass

class Mytype(type):

    def __init__(self, *args, **kwargs):
        self.haha=haha()

class zx(metaclass=Mytype):
    pass

print(zx.__dict__)
z1=zx()
z2=zx()

print(z1.haha)
print(z2.haha)
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'zx' objects>, '__weakref__': <attribute '__weakref__' of 'zx' objects>, '__doc__': None, 'haha': <__main__.haha object at 0x000002817458DD30>}
<__main__.haha object at 0x000002817458DD30>
<__main__.haha object at 0x000002817458DD30>
posted @ 2019-09-05 14:57  zx125  阅读(124)  评论(0编辑  收藏  举报