python单例模式原理与创建方法实例分析


Posted in Python onOctober 26, 2019

本文实例讲述了python单例模式原理与创建方法。分享给大家供大家参考,具体如下:

1. 单例是什么

举个常见的单例模式例子,我们日常使用的电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。

2. 创建单例-保证只有1个对象

# 实例化一个单例
class Singleton(object):
  __instance = None
  def __new__(cls, age, name):
    #如果类数字__instance没有或者没有赋值
    #那么就创建一个对象,并且赋值为这个对象的引用,保证下次调用这个方法时
    #能够知道之前已经创建过对象了,这样就保证了只有1个对象
    if not cls.__instance:
      cls.__instance = object.__new__(cls)
    return cls.__instance
a = Singleton(18, "xxx")
b = Singleton(8, "xxx")
print(id(a))
print(id(b))
a.age = 19 #给a指向的对象添加一个属性
print(b.age)#获取b指向的对象的age属性

运行结果:

4391023224
4391023224
19

3. 创建单例时,只执行1次init方法

# 实例化一个单例
class Singleton(object):
  __instance = None
  __first_init = False
  def __new__(cls, age, name):
    if not cls.__instance:
      cls.__instance = object.__new__(cls)
    return cls.__instance
  def __init__(self, age, name):
    if not self.__first_init:
      self.age = age
      self.name = name
      Singleton.__first_init = True
a = Singleton(18, "xxx")
b = Singleton(8, "xxx")
print(id(a))
print(id(b))
print(a.age)
print(b.age)
a.age = 19
print(b.age)

运行结果:

139953926130600
139953926130600
18
18
19

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现跨文件全局变量的方法
Jul 07 Python
Python 迭代器与生成器实例详解
May 18 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
python3+PyQt5实现拖放功能
Apr 24 Python
解决python读取几千万行的大表内存问题
Jun 26 Python
Python实现快速傅里叶变换的方法(FFT)
Jul 21 Python
python定位xpath 节点位置的方法
Aug 27 Python
python urllib爬虫模块使用解析
Sep 05 Python
如何利用Python开发一个简单的猜数字游戏
Sep 22 Python
Pytorch Tensor基本数学运算详解
Dec 30 Python
opencv 图像加法与图像融合的实现代码
Jul 08 Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 Python
Python aiohttp百万并发极限测试实例分析
Oct 26 #Python
python实现淘宝购物系统
Oct 25 #Python
DJANGO-URL反向解析REVERSE实例讲解
Oct 25 #Python
python计算n的阶乘的方法代码
Oct 25 #Python
Python OrderedDict的使用案例解析
Oct 25 #Python
python编写计算器功能
Oct 25 #Python
Python实现快速排序的方法详解
Oct 25 #Python
You might like
农民和部队如何穿矿
2020/03/04 星际争霸
php连接mysql数据库代码
2009/03/10 PHP
PHP中strtotime函数使用方法详解
2011/11/27 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
PHP的pcntl多进程用法实例
2015/03/19 PHP
Laravel框架实现多个视图共享相同数据的方法详解
2019/07/09 PHP
input按钮的事件处理大全
2010/12/10 Javascript
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
JS未跨域操作iframe里的DOM
2016/06/01 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
Python MD5文件生成码
2009/01/12 Python
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
高三毕业典礼主持词
2014/03/27 职场文书
植树节标语
2014/06/27 职场文书
小学生交通安全寄语
2015/02/27 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
MySQL 十大常用字符串函数详解
2021/06/30 MySQL
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js