Python单例模式的4种实现方法
- #-*- encoding=utf-8 -*-
- print '----------------------方法1--------------------------'
- #方法1,实现__new__方法
- #并在将一个类的实例绑定到类变量_instance上,
- #如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回
- #如果cls._instance不为None,直接返回cls._instance
- 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
- one = MyClass()
- two = MyClass()
- two.a = 3
- print one.a
- #3
- #one和two完全相同,可以用id(), ==, is检测
- print id(one)
- #29097904
- print id(two)
- #29097904
- print one == two
- #True
- print one is two
- #True
- print '----------------------方法2--------------------------'
- #方法2,共享属性;所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法)
- #同一个类的所有实例天然拥有相同的行为(方法),
- #只需要保证同一个类的所有实例具有相同的状态(属性)即可
- #所有实例共享属性的最简单最直接的方法就是__dict__属性指向(引用)同一个字典(dict)
- #可参看:http://code.activestate.com/recipes/66531/
- 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
- one = MyClass2()
- two = MyClass2()
- #one和two是两个不同的对象,id, ==, is对比结果可看出
- two.a = 3
- print one.a
- #3
- print id(one)
- #28873680
- print id(two)
- #28873712
- print one == two
- #False
- print one is two
- #False
- #但是one和two具有相同的(同一个__dict__属性),见:
- print id(one.__dict__)
- #30104000
- print id(two.__dict__)
- #30104000
- print '----------------------方法3--------------------------'
- #方法3:本质上是方法1的升级(或者说高级)版
- #使用__metaclass__(元类)的高级python用法
- class Singleton2(type):
- def __init__(cls, name, bases, dict):
- super(Singleton2, cls).__init__(name, bases, dict)
- cls._instance = None
- def __call__(cls, *args, **kw):
- if cls._instance is None:
- cls._instance = super(Singleton2, cls).__call__(*args, **kw)
- return cls._instance
- class MyClass3(object):
- __metaclass__ = Singleton2
- one = MyClass3()
- two = MyClass3()
- two.a = 3
- print one.a
- #3
- print id(one)
- #31495472
- print id(two)
- #31495472
- print one == two
- #True
- print one is two
- #True
- print '----------------------方法4--------------------------'
- #方法4:也是方法1的升级(高级)版本,
- #使用装饰器(decorator),
- #这是一种更pythonic,更elegant的方法,
- #单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的
- def singleton(cls, *args, **kw):
- instances = {}
- def _singleton():
- if cls not in instances:
- instances[cls] = cls(*args, **kw)
- return instances[cls]
- return _singleton
- @singleton
- class MyClass4(object):
- a = 1
- def __init__(self, x=0):
- self.x = x
- one = MyClass4()
- two = MyClass4()
- two.a = 3
- print one.a
- #3
- print id(one)
- #29660784
- print id(two)
- #29660784
- print one == two
- #True
- print one is two
- #True
- one.x = 1
- print one.x
- #1
- print two.x
- #1
Python单例模式的4种实现方法相关推荐
- python单例模式的4种实现方法_Python单例模式的4种实现
模块在一个Python应用程序中只有一份,它本身就是单例的,将所需要的属性和方法,直接暴露在模块中的全局变量和方法,也可以实现单例. Python单例模式的4种实现 # !/usr/bin/env p ...
- python 单例模式的四种实现方法
DAY 13. 单例设计 13.1 什么是单例设计 一个类每次实例化返回的都是同一个对象,这种设计模式叫做单例设计,这个类叫做单例类 13.2 实现单例设计的方法 13.2.1 重写__new__() ...
- Python单例模式的4种实现方法(转)
2019独角兽企业重金招聘Python工程师标准>>> [python] view plain copy #-*- encoding=utf-8 -*- print '------ ...
- python最简单单例模式_Python单例模式的4种实现方法 | 学步园
Python单例模式的4种实现方法: 方法1: 实现__new__方法,并将一个类的实例绑定到类变量_instance上.如果cls._instace为None,说明该类还未实例化过,实例化该类,并返 ...
- python多线程有几种实现方法
python多线程有几种实现方法,都是什么? 目前python 提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,而thread ...
- Python单例模式中几种实现及优化方法
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- python单例模式代码-5种Python单例模式的实现方式
本文为大家分享了Python创建单例模式的5种常用方法,供大家参考,具体内容如下 所谓单例,是指一个类的实例从始至终只能被创建一次. 方法1: 如果想使得某个类从始至终最多只有一个实例,使用__new ...
- 单例模式的5种实现方法及优缺点
单例模式是GoF23种设计模式中创建型模式的一种,也是所有设计模式中最简单的一种. 单例模式是用来保证系统中某个资源或对象全局唯一的一种模式,比如系统的线程池.日志收集器等.它保证了资源在系统中只有一 ...
- python文件的两种编译方法
有时候,需要对python程序项目进行打包,即仅打包python文件编译后的pyc文件,就需要对python文件进行编译. 编译方法有两种: 1.写一个python简本,对所需编译的文件进行编译.(针 ...
最新文章
- 微软官方教程教你如何在Windows上做Python开发?
- axios get 某个参数是数组怎么传_Vue 中 Axios 的封装和 API 接口的管理
- gulp编译less简单demo
- 计算机基础八进制和十六进制试题,计算机基础知识考试试题
- 面试题:双重检验锁⽅式实现 单例模式
- 【网络安全工程师面试题】数据库存在的漏洞及渗透方法
- html浮动提示框,JavaScript浮动提示框Tooltip效果
- BottomNavigationView--基本使用总结
- ubuntu开机密码破解
- MacOS中的剪切快捷键
- **懒得给孩子讲故事怎么办**
- Laravel的env和config傻傻分不清?
- Seaweedfs的安装和使用--研究
- (1)从1开始写一个操作系统
- 关于皓月GOM登录器配置器批量生成详细说明
- 微信小程序面向个人开放-附超详尽申请教程
- 【2021最新版】《定时执行专家 5.2》软件使用手册
- win+G没反应,Xbox game bar按不出来
- 京东商城项目实战(1)------京东商城首页
- Java实现手机号码归属地
热门文章
- java 运行os文件路径_Java获取文件路径的几种方式
- python做一副54扑克牌发牌技巧_德州扑克讲堂:高级技巧 胜率之摊牌胜率的算法...
- swagger 动态设置版本号_如何快速玩转swagger
- Windows下使用net user命令管理账户
- 网络交换机3大常见故障问题
- [渝粤教育] 昆明理工大学 会计学 参考 资料
- 【渝粤教育】国家开放大学2018年秋季 0062-22T港台文学专题讲座 参考试题
- [渝粤教育] 西南科技大学 经济法概论 在线考试复习资料2021版(3)
- 【渝粤题库】国家开放大学2021春3897商务英语1题目
- 2021年春季学期期末统一考试 金融统计分析 试题(开卷)