zoukankan      html  css  js  c++  java
  • Python中的单例模式

      介绍

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

      单例模式的实现

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

      其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。

    class Person():
        def foo(self):
            pass
    
    p1 = Person()
    a/b.py

      在另一个文件中导入使用就可以了。

    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打印结果

    方式三:用__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打印结果

    好了,先介绍这三种吧,python实现单例模式方式有很多,但是另外几种我自己都还没有弄清楚。。。以后慢慢补。

    未完待续。。。

    Fake it,till you make it
  • 相关阅读:
    二分匹配最大匹配的理解(附图解)
    poj2060Taxi Cab Scheme(二分图匹配)
    codeforce Pashmak and Buses(dfs枚举)
    UVAoj 348
    poj2253 Frogger(最短路变型或者最小生成树)
    ZZUOJ1196: 单调数
    hdu3339 In Action(Dijkstra+01背包)
    ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)
    hdu 1241 Oil Deposits (一次dfs搞定有某有)
    POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)
  • 原文地址:https://www.cnblogs.com/wusir66/p/10016503.html
Copyright © 2011-2022 走看看