单例模式

_new_方法

class Singleton(object):
    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            orig = super(Singleton, cls)
            cls._instance = orig.__new__(cls, *args, **kw)
        return cls._instance

class MyClass(Singleton):
    a = 1

这个方法,把类的实例和一个类变量_instance关联起来了,这样可以控制该类只有一个实例.

共享属性

创建实例时把所有实例的dict指向同一个字典,这样它们具有相同的属性和方法.

class Borg(object):
    _state = {}
    def __new__(cls, *args, **kw):
        ob = super(Borg, cls).__new__(cls, *args, **kw)
        ob.__dict__ = cls._state
        return ob

class MyClass2(Borg):
    a = 1

装饰器实现

def singleton(cls):
    instances = {}
    def getinstance(*args, **kw):
        if cls not in instances:
            instances[cls] = cls(*args, **kw)
        return instances[cls]
    return getinstance

@singleton
class MyClass:
  ...

在上面,我们定义了一个装饰器 singleton,它返回了一个内部函数 getinstance,该函数会判断某个类是否在字典 instances 中,如果不存在,则会将 cls 作为 key,cls(*args, **kw) 作为 value 存到 instances 中,否则,直接返回 instances[cls]。

import方法

作为python的模块是天然的单例模式

# mysingleton.py
class My_Singleton(object):
    def foo(self):
        pass

my_singleton = My_Singleton()

# to use
from mysingleton import my_singleton

my_singleton.foo()

本文转自http://python.jobbole.com/87294/
记录于此方便日后查阅

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

相关阅读更多精彩内容

  • 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只...
    马小跳_阅读 1,306评论 0 0
  • 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例...
    万越天阅读 4,239评论 0 0
  • jquery.validate添加验证之后,验证会一直存在,如果需要取消验证,可以给其添加属性值ignore。
    林小刀2_0阅读 1,274评论 0 0
  • 今天要去兼职的单位上班,我到办公室的时候李经理在搞卫生。她在我的心中是一个很有生活品质的人。她生活上干净整洁,热爱...
    搞定自己阅读 1,382评论 0 0
  • 今天,我差一点就表白成功了。我:你究竟喜不喜欢我。他:不喜欢我:那祝你幸福快乐。然后转身抹泪跑走 过了就好我和他正...
    爱写作的我么么哒阅读 1,877评论 0 0

友情链接更多精彩内容