Python中的单例模式

  介绍

  单例模式(Singleton Pattern)是一种经常使用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你但愿在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。在它的核心结构中只包含一个被称为单例的特殊类。经过单例模式能够保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。python

  单例模式的实现

方式一:python就是自然的单例模式

  其实,Python 的模块就是自然的单例模式,由于模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。所以,咱们只需把相关的函数和数据定义在一个模块中,就能够得到一个单例对象了。设计模式

class Person():
    def foo(self):
        pass

p1 = Person()
a/b.py

  在另外一个文件中导入使用就能够了。ide

from a.b import p1
print(id(p1.foo()))

  你会发现,无论使用多少次,或者在几个文件中引用,每次打印的id都是相同的。函数

方式二:使用装饰器

def outer(cls):
    instance = None
    def inner(*args,**kwargs):
        nonlocal instance
        if instance == None:
            instance = cls(*args,**kwargs)
        return instance
    return inner

@outer
class Person():
    def __init__(self):
        pass

p1 = Person()
p2 = Person()
print(id(p1))
print(id(p2))

id打印结果spa

方式三:用__new__方式实现单例模式

  咱们知道,当咱们实例化一个对象时,是先执行了类的__new__方法(咱们没写时,默认调用object.__new__),实例化对象;而后再执行类的__init__方法,对这个对象进行初始化,全部咱们能够基于这个,实现单例模式。设计

class Person(object):
    __instance = None
    def __new__(cls, *args, **kwargs):
        if cls.__instance == None:
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def __init__(self):
        pass

p1 = Person()
p2 = Person()
print(id(p1))
print(id(p2))

id打印结果3d

好了,先介绍这三种吧,python实现单例模式方式有不少,可是另外几种我本身都尚未弄清楚。。。之后慢慢补。code

未完待续。。。

相关文章
相关标签/搜索