17.python如何实现单例模式?请写出两种实现方式?

第一种方法:使用装饰器

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 )#True

第二种方法:使用基类 New 是真正创建实例对象的方法,所以重写基类的new 方法,以此保证创建对象的时候只生成一个实例

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

第三种方法:元类,元类是用于创建类对象的类,类对象创建实例对象时一定要调用call方法,因此在调用call时候保证始终只创建一个实例即可,type是python的元类

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. 問題排查:DataGridView 資料行下拉選單,資料繫結階段顯示 DataGridViewComboBoxCell 值無效
  2. 出现( linker command failed with exit code 1)错误总结
  3. 55.Android之AsyncTask介绍 (转)
  4. leetcode 86. Partition List
  5. MyEclipse背景色不伤眼+字体大小调节+代码格式化不换行
  6. 使用HQL语句的按照参数名字查询数据库信息的时候 “=:”和参数之间不能存在空格,否则会报错
  7. CSS设置行内元素和块级元素的水平居中、垂直居中
  8. java coding recommand
  9. 九度OJ 1468 Sharing -- 哈希
  10. 朋友的礼物(英雄会,csdn,高校俱乐部)信封问题,匹配模型
  11. [分享]我的LABVIEW快速开发串口测试软件实例
  12. 自由的Debian
  13. 给Cygwin重新安装curl
  14. Vuejs 页面的区域化与组件封装
  15. Taffy Web开发,Python Flask实践详解
  16. 【转】Maven pom.xml 配置详解
  17. STM32学习笔记:【003】GPIO
  18. selenium处理弹出窗口
  19. oj错误之char型超出范围
  20. 数据库sql优化总结之1-百万级数据库优化方案+案例分析

热门文章

  1. KindEditor配置和使用
  2. Dynamics CRM 365中结合注释和WebApi实现图片上传
  3. Java输入和输出数组(加逗号)
  4. webkit 技术内幕 笔记 二
  5. Java中的实体类--Serializable接口、transient 关键字
  6. sublime text 3安装html-css-js prettify后使用时报错An unhandled OS error was encountered
  7. python 元组 列表 字典
  8. pip问题:Traceback (most recent call last): File "/usr/bin/pip", line 9, in
  9. 梯度下降算法&线性回归算法
  10. C++-POJ1502-MPI Maelstrom-[最短路][spfa][栈优化]