文档章节

python中实现单例的三种方法

中华强仔
 中华强仔
发布于 2017/07/22 19:16
字数 352
阅读 2
收藏 0

方法一:使用装饰器

装饰器维护一个字典对象instances,缓存了所有单例类,只要单例不存在则创建,已经存在直接返回该实例对象。

 

Python

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

def singleton(cls):

    instances = {}

 

    def wrapper(*args, **kwargs):

        if cls not in instances:

            instances[cls] = cls(*args, **kwargs)

        return instances[cls]

 

    return wrapper

 

 

@singleton

class Foo(object):

    pass

 

foo1 = Foo()

foo2 = Foo()

 

print foo1 is foo2

 

方法二:使用基类

__new__是真正创建实例对象的方法,所以重写基类的__new__方法,以此来保证创建对象的时候只生成一个实例

 

Python

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

class Singleton(object):

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

        if not hasattr(cls, '_instance'):

            cls._instance = super(Singleton, cls).__new__(cls, *args,**kwargs)

        return cls._instance

 

 

class Foo(Singleton):

    pass

 

foo1 = Foo()

foo2 = Foo()

 

print foo1 is foo2  # True

 

方法三:使用元类

元类(参考:深刻理解Python中的元类)是用于创建类对象的类,类对象创建实例对象时一定会调用__call__方法,因此在调用__call__时候保证始终只创建一个实例即可,type是python中的一个元类。

 

Python

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

class Singleton(type):

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

        if not hasattr(cls, '_instance'):

            cls._instance = super(Singleton, cls).__call__(*args,**kwargs)

        return cls._instance

 

 

class Foo(object):

    __metaclass__ = Singleton

 

 

foo1 = Foo()

foo2 = Foo()

 

print foo1 is foo2  # True

© 著作权归作者所有

中华强仔
粉丝 1
博文 9
码字总数 9269
作品 0
浦东
程序员
私信 提问
python使用__new__来实现singleton单例模型

在软件设计过程中,根据需求需要实现singleton单例模型。比如创建数据库的连接实例。下面利用python新式类里的new的静态方法来实现。 new原型为object.new(cls,[...]),cls是一个类对象。当你...

iamyangjy
2014/02/18
532
0
python 与设计模式 ——工厂与单例

python 与设计模式 源码地址:[http://git.oschina.net/duoduo3_69/python_design_pattern][1] git checkout v001(这个版本与此篇博客相符) zarkpy里面运用了很多设计模式,以前一直很费解p...

duoduo3_69
2013/11/27
879
0
zg手册 之 python2.7.7源码分析(2)-- python 的整数对象和字符串对象

python 中的内置对象 python 中常用的内置对象有:整数对象,字符串对象,列表对象,字典对象。这些对象在python中使用最多,所以在实现上提供缓存机制,以提高运行效率。 整数对象 (PyIntOb...

东昕
2014/08/08
270
0
能让你代码更 Pythonic 的小技巧

下面例举几个在工作中用到过,个人认为比较 Pythonic 的一些实现个技巧: cached_property 它的作用是将一个方法的计算结果缓存到对象的 当中,熟悉 Flask 的人对这个应该不陌生,Django 应该...

实验楼
2018/06/19
0
0
Python Singleton(单例模式)实现

重载new方法 class Singleton(object): 使用装饰器 class SingletonDecorator(object): class DemoCls(object): DemoCls = SingletonDecorator(DemoCls) After this the DemoCls is bind wi......

用户名已存在
2012/03/27
2.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
7
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
昨天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
昨天
2.6K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
昨天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部