方法一:装饰器

利用“装饰器只会执行一次”这个特点

  1. def singleton(cls):
  2. instances = []# 为什么这里不直接为None,因为内部函数没法访问外部函数的非容器变量
  3. def getinstance(*args, **kwargs):
  4. if not instances:
  5. instances.append(cls(*args, **kwargs))
  6. return instances[0]
  7. return getinstance
  8.  
  9. @singleton
  10. class Foo:
  11. a = 1
  12.  
  13. f1 = Foo()
  14. f2 = Foo()
  15. print id(f1), id(f2)

方法二:基类

利用“类变量对所有对象唯一”,即cls._instance

  1. class Singleton(object):
  2. def __new__(cls, *args, **kwargs):
  3. if not hasattr(cls, '_instance'):
  4. cls._instance = object.__new__(cls, *args, **kwargs)
  5. return cls._instance
  6.  
  7. class Foo(Singleton):
  8. a = 1

方法三:metaclass

利用“类变量对所有对象唯一”,即cls._instance

  1. class Singleton(type):
  2. def __call__(cls, *args, **kwargs):
  3. if not hasattr(cls, '_instance'):
  4. cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
  5. return cls._instance
  6.  
  7. class Foo():
  8. __metaclass__ = Singleton

方法四:Borg模式

利用“类变量对所有对象唯一”,即__share_state

  1. class Foo:
  2. __share_state = {}
  3. def __init__(self):
  4. self.__dict__ = self.__share_state

方法五:利用import

利用“模块只会被import一次”

  1. #在文件mysingleton中
  2. class Foo(object):
  3. pass
  4.  
  5. f = Foo()

然后在其它模块,from mysingleton import f 
直接拿f当作单例的对象来用

 
 转自:http://blog.csdn.net/handsomekang/article/details/46672047

飘逸的python - 单例模式乱弹的更多相关文章

  1. 飘逸的python - __new__、__init__、__call__傻傻分不清

    __new__: 对象的创建,是一个静态方法.第一个參数是cls.(想想也是,不可能是self,对象还没创建,哪来的self) __init__ : 对象的初始化, 是一个实例方法,第一个參数是sel ...

  2. 飘逸的python - 性能调优利器profile及其意义

    VIM 的作者Bram Moolenaar在一篇叫高效文本编辑器的7个习惯的ppt中有这么一段话. Three basic steps 1.    Detect inefficiency 2.    ...

  3. python 单例模式获取IP代理

    python 单例模式获取IP代理 tags:python python单例模式 python获取ip代理 引言:最近在学习python,先说一下我学Python得原因,一个是因为它足够好用,完成同样 ...

  4. Python 单例模式讲解

    Python 单例模式讲解 本节内容: classmethod用途 单例模式方法一 类__new__方法讲解 单例模式方法二 前言: 使用单例方法的好处:对于一个类,多次实例化会产生多个对象,若使用单 ...

  5. python单例模式的实现与优化

    python单例模式的实现与优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法实现(推荐使用,方便) 5.基于me ...

  6. python 单例模式

    单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在 用装饰器方式实现单例模式 #!/usr/bin/python # coding=utf-8 d ...

  7. Python单例模式

    1.单例模式介绍 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时, 单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个 全局对象,这样有利于我们协调系统整体的行为 ...

  8. python 单例模式的四种创建方式

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  9. python 单例模式的四种实现方法及注意事项

    一.模块单例 Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码. #foo1.py clas ...

随机推荐

  1. 机器学习(二十三)— L0、L1、L2正则化区别

    1.概念  L0正则化的值是模型参数中非零参数的个数. L1正则化表示各个参数绝对值之和. L2正则化标识各个参数的平方的和的开方值. 2.问题  1)实现参数的稀疏有什么好处吗? 一个好处是可以简化 ...

  2. algorithm 简单用法

    algorithm 简单用法 #include <iostream> #include <vector> #include <algorithm> using na ...

  3. BEC listen and translation exercise 33

    In fact, if it is a really hot day, like the sort of weather we had last summer, you are advised to ...

  4. I.MX6 Busybox watchdog

    /************************************************************************* * I.MX6 Busybox watchdog ...

  5. C#连接solr时提示 java内存异常 (jetty和tomcat哪个更High) java.lang.OutOfMemoryError

    C#连接solr时提示 java内存异常   java.lang.OutOfMemoryError 时间:20180130 09:51:13.329,消息:异常消息<?xml version=& ...

  6. 洛谷【P1619】 解一元二次方程的烦恼

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P16 ...

  7. CF1060B:Maximum Sum of Digits

    我对贪心的理解:https://www.cnblogs.com/AKMer/p/9776293.html 题目传送门:http://codeforces.com/problemset/problem/ ...

  8. BZOJ1720:[Usaco2006 Jan]Corral the Cows 奶牛围栏

    我对二分的理解:https://www.cnblogs.com/AKMer/p/9737477.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...

  9. 【转】mysql查询当天所有数据sql语句

    mysql查询当天的所有信息: select * from test where year(regdate)=year(now()) and month(regdate)=month(now()) a ...

  10. HDOJ2043(JAVAset容器练习)

    import java.io.PrintWriter; import java.util.HashSet; import java.util.Scanner; public class Main { ...