python单例设计模式实现解析
这篇文章主要介绍了python单例设计模式实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
所谓单例,就是让类创建对象的时候,在系统中只有唯一的一个实例。
(1)定义一个类属性,初始值是None,用于记录单例的引用。
(2)重写__new__方法。
(3)如果类属性是None,调用父类方法分配空间,并在属性中记录结果。
(4)返回属性中记录的对象引用。
class MusicPlayer(object): instance = None def __new__(cls, *args, **kwargs): if cls.instance is None: print("创建对象,分配空间") cls.instance = super().__new__(cls) return cls.instance def __init__(self): print("播放器初始化") player1 = MusicPlayer() print(player1) player2 = MusicPlayer() print(player2)
输出:
我们发现,对象只被创建了一次,当要再创建一个对象时,实际上调用的是已经存在的同一个对象,均是唯一的地址, 但是,我们发现初始化操作却被执行了两次,这不符合我们的要求,解决办法如下:
(1)定义一个类属性init_flag标记是否执行过初始化操作,初始值为False。
(2)在__init__方法中判断是否进行过初始化,如果执行了,将init_flag置为True。
(3)再次调用__init__时,初始化就不会被执行了。
class MusicPlayer(object): instance = None init_flag = False def __new__(cls, *args, **kwargs): if cls.instance is None: print("创建对象,分配空间") cls.instance = super().__new__(cls) return cls.instance def __init__(self): if not MusicPlayer.init_flag: print("播放器初始化") MusicPlayer.init_flag = True else: return player1 = MusicPlayer() print(player1) player2 = MusicPlayer() print(player2)
输出:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
Python操作json数据的一个简单例子
更多的信息,可以参考python内部的json文档: python>>> help(json) 或者官方文档: http://docs.python.org/library/json.html#module-json. 下面给出一个使用python解析json的简单例子: 复制代码 代码如下: #!/usr/bin/python import json #Function:Analyze json script #Json is a script can descript data st
-
Python中实现单例模式的n种方式和原理
在Python中如何实现单例模式?这可以说是一个经典的Python面试题了.这回我们讲讲实现Python中实现单例模式的n种方式,和它的原理. 什么是单例模式 维基百科 中说: 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获
-
Python中实现远程调用(RPC、RMI)简单例子
远程调用使得调用远程服务器的对象.方法的方式就和调用本地对象.方法的方式差不多,因为我们通过网络编程把这些都隐藏起来了.远程调用是分布式系统的基础. 远程调用一般分为两种,远程过程调用(RPC)和远程方法调用(RMI). RPC RPC属于函数级别的远程调用,其多是通过HTTP传输数据,数据形式有XML.JSON.序列化数据等.在此,用python做一个xml-rpc的示例. 先给服务器端server.py: 复制代码 代码如下: from SimpleXMLRPCServer import S
-
5种Python单例模式的实现方式
本文为大家分享了Python创建单例模式的5种常用方法,供大家参考,具体内容如下 所谓单例,是指一个类的实例从始至终只能被创建一次. 方法1: 如果想使得某个类从始至终最多只有一个实例,使用__new__方法会很简单.Python中类是通过__new__来创建实例的: class Singleton(object): def __new__(cls,*args,**kwargs): if not hasattr(cls,'_inst'): cls._inst=super(Singleton,cl
-
常见的在Python中实现单例模式的三种方法
单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例.在Python中,单例模式有以下几种实现方式. 方法一.实现__new__方法,然后将类的一个实例绑定到类变量_instanc
-
Python中单例模式总结
一.单例模式 a.单例模式分为四种:文件,类,基于__new__方法实现单例模式,基于metaclass方式实现 b.类实现如下: class Sigletion(objects): import time def __init__(self): time.sleep(1) @classmethod def instance(cls,*args,**kwargs) if not hasattr(Sigletion,'_instance'): Sigletion._instance=Sigleti
-
详解python实现线程安全的单例模式
单例模式是一种常见的设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,服务器的配置信息写在一个文件中online.conf中,客户端通过一个 Config 的类来读取配置文件的内容.如果在程序运行期间,有很多地方都需要使用配置文件的内容,那么每个调用配置文件的地方都会创建 Config的实例,这就导致系统中存在多个Config 的实例对象,在配置文件内容很多的情况下,我们就浪费了大量的内存做了同样的事.事实上,
-
python单例模式实例解析
本文实例为大家分享了python单例模式的具体代码,供大家参考,具体内容如下 多次实例化的结果指向同一个实例 单例模式实现方式 方式一: import settings class MySQL: __instance = None def __init__(self, ip, port): self.ip = ip self.port = port @classmethod def from_conf(cls): if cls.__instance is None: cls.__instance
-
详解python实现小波变换的一个简单例子
最近工作需要,看了一下小波变换方面的东西,用python实现了一个简单的小波变换类,将来可以用在工作中. 简单说几句原理,小波变换类似于傅里叶变换,都是把函数用一组正交基函数展开,选取不同的基函数给出不同的变换.例如傅里叶变换,选择的是sin和cos,或者exp(ikx)这种复指数函数:而小波变换,选取基函数的方式更加灵活,可以根据要处理的数据的特点(比如某一段上信息量比较多),在不同尺度上采用不同的频宽来对已知信号进行分解,从而尽可能保留多一点信息,同时又避免了原始傅里叶变换的大计算量.以下计
-
python单例设计模式实现解析
这篇文章主要介绍了python单例设计模式实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 所谓单例,就是让类创建对象的时候,在系统中只有唯一的一个实例. (1)定义一个类属性,初始值是None,用于记录单例的引用. (2)重写__new__方法. (3)如果类属性是None,调用父类方法分配空间,并在属性中记录结果. (4)返回属性中记录的对象引用. class MusicPlayer(object): instance = None
-
Python 单例设计模式用法实例分析
本文实例讲述了Python 单例设计模式用法.分享给大家供大家参考,具体如下: demo.py(单例): class MusicPlayer(object): # 类属性 记录对象引用 instance = None def __new__(cls, *args, **kwargs): # 1. 判断类属性是否是空对象 if cls.instance is None: # 2. 调用父类的方法,为第一个对象分配空间 cls.instance = super().__new__(cls) # 3.
-
Java实现单例设计模式方法解析
单例模式的几种实现方式: 一:饿汉式单例 方式一:枚举方式获得单例对象 方式二:静态属性获得单例对象 方式三:静态方法获得单例对象 二:懒汉式单例 方式一:静态方法获得单例对象(线程安全) 方式二:内部类方式去获取单例对象 示例: 恶汉式:方式一 enum Singleton{ INSTANCE;//单例 } 恶汉式:方式二 class Singleton{ public static final Singleton INSTANCE = new Singleton();//单例 private
-
完美解决单例设计模式中懒汉式线程安全的问题
首先写个单例: public class SingleDemo { private static SingleDemo s = null; private SingleDemo(){} public static SingleDemo getInstance(){ if(s == null){ s = new SingleDemo(); } return s; } } 写个测试类: public class ThreadDemo3 { public static void main(String
-
浅谈JAVASE单例设计模式
简单的说设计模式,其实就是对问题行之有效的解决方式.其实它是一种思想. 1.单例设计模式. 解决的问题:就是可以保证一个类在内存中的对象唯一性.(单个实例) 使用单例设计模式需求:必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性. 如何保证对象唯一性? 解决步骤: 1.不允许其他程序用new创建该对象.
-
Unity通用泛型单例设计模式(普通型和继承自MonoBehaviour)
单例模式是设计模式中最为常见的,不多解释了.但应该尽量避免使用,一般全局管理类才使用单例. 普通泛型单例: public abstract class Singleton<T> where T : class, new() { private static T instance = null; private static readonly object locker = new object(); public static T Instance { get { lock (locker)
-
Java之单例设计模式示例详解
单例设计模式 保证一个类在内存中只能有一个对象. 思路: 1)如果其他程序能够随意用 new 创建该类对象,那么就无法控制个数.因此,不让其他程序用 new 创建该类的对象. 2)既然不让其他程序 new 该类对象,那么该类在自己内部就要创建一个对象,否则该类就永远无法创建对象了. 3)该类将创建的对象对外(整个系统)提供,让其他程序获取并使用. 饿汉式: 一上来我就把对象给你 new 好了,你来了直接就可以拿去"吃"了 懒汉式 (要是有人问单例的延迟加载方式指的就是这种方式) 一开始
-
浅析Java单例设计模式(自写demo)
目录 单例模式特点 单例模式优点 实现方式 饿汉式(线程安全) 懒汉式 单例模式特点 1.构造器私有 2.在一个Java应用程序中,可保证只有一个实例对象 3.只提供一个供外界调用的getInstance()方法 单例模式优点 1.减少某些对象的频繁创建,降低系统开销和内存占用 2.外部调用不使用new关键字,降低系统内存的使用频率 3.对于特殊的类,在系统中只能存在一个实例,否则系统无法正常运行,比如Controller 实现方式 这里简单介绍两种实现方式 饿汉式(线程安全) /** * @a
-
C++简明图解分析静态成员与单例设计模式
目录 静态成员概述 静态成员数据 static修饰静态成员函数 const修饰静态成员 const修饰成员函数 静态成员案例 单例模式 静态成员概述 1.静态成员包括静态成员数据.静态成员函数 2.成员数据.成员函数被 static修饰 就叫静态成员数据.静态成员函数 3.不管这个类创建了多少个对象,静态成员只有一份,这一份被所有属于这个类的对象共享. 4.静态成员 是属于类 而不是具体的某个对象. 5.静态成员 是在定义完类的时候 就存在了. 静态成员数据 静态变量,是在编译阶段就分配空间,对
-
C++单例设计模式详细讲解
目录 特殊类设计 只能在堆上创建对象的类 请设计一个类只能在栈上创建对象 请设计一个类不能被拷贝 请设计一个类不能被继承 请设计一个类只能创建一个对象(单例模式) 懒汉模式和饿汉模式的对比 特殊类设计 只能在堆上创建对象的类 请设计一个类,只能在堆上创建对象 实现方式: 将类的构造函数私有,拷贝构造声明成私有.防止别人调用拷贝在栈上生成对象. 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建 class test { public: static test* GetObj() { re
随机推荐
- Mac下MySQL5.7忘记root密码的解决方法
- Vue.js基础学习之class与样式绑定
- SqlServer2008 数据库同步的两种方式(发布、订阅使用方法)
- 在Docker上安装配置Oracle教程
- Android GridView简单实例
- Symfony页面的基本创建实例详解
- 30分钟搞清楚Android Touch事件分发机制
- 深入理解Vue.js源码之事件机制
- Lua中的逻辑运算符使用详解
- 揭秘SQL Server 2014有哪些新特性(4)-原生备份加密
- Jquery Easyui菜单组件Menu使用详解(15)
- jQuery 性能优化指南(2)
- 在JavaScript中实现类的方式探讨
- Android 4.4以上"沉浸式"状态栏效果的实现方法
- 深入解析php之apc
- C#枚举类型和结构体详解
- vant(ZanUi)结合async-validator实现表单验证的方法
- Java基础教程之HashMap迭代删除使用方法
- string居然也可以用<<和>>
- 基于SSIS 事件的向上传递(详解)