Python实现单例

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

我们在使用class创建类的时候, 只会创建一个类对象, 但是, 当我们实例化这个类对象的时候, 一个类对象, 可以实例化出很多不同的对象, 而我们每次实例化出来一个对象, 就会在内存中重新分配一块空间, 而今天介绍的单例模式, 就是为了解决上述问题, 使得由一个类对象所实例化出来的全部对象都指向同一块内存空间.
 

要想弄明白为什么每个对象被实例化出来之后, 都会重新被分配出一块新的内存地址, 就要清楚一个python中的内置函数__new__(), 它跟__init__()一样, 都是对象在被创建出来的时候, 就自动执行的一个函数, init()函数, 是为了给函数初始化属性值的, 而__new__()这个函数, 就是为了给对象在被实例化的时候, 分配一块内存地址, 因此, 我们可以重写__new__()这个方法, 让他在第一次实例化一个对象之后, 分配一块地址, 在此后的所有实例化的其他对象时, 都不再分配新的地址, 而继续使用第一个对象所被分配的地址, 因此, 我们可以在类对象里, 定义一个类属性, 初始值设为None, 如果这个值是None就调用父类的__new__()方法, 为其分配地址, 并返回这个地址(__new__方法一定要返回一个地址)
 

比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

 

每次实例化一个对象时,都会先调用 __new__() 创建一个对象,再调用 __init__() 函数初始化数据。因而,在 new 函数中判断 ExecSql类 是否已经实例化过,如果不是,调用父类的 new 函数创建实例;否则返回之前创建的实例。

_instance 作为类属性,保证了所有对象的 _instance 都是同一个,我们可以看到下面例子中多个实例化的内存地址是一样的,是最新实例的值

单例实际是当多处调用进行多次实例化时,当类已实例化过,直接用实例化好的对象,当类未实例化过时,进行实例化对象,多处调用进行多次实例化实际只发生了一次实例化,共用1个实例化对象内存地址,所以实例对象是一样的

class ExecSql(object):_instance=Nonedef __new__(cls,*args,**kwargs):print("实例化时优先调用new方法,创建实例对象,这个方法是实现单例")if cls._instance is None:cls._instance=super().__new__(cls)return cls._instancedef __init__(self,name,age):print("实例化时,初始化方法,初始化一些数据")self.name=nameself.age=agetest1 = ExecSql("橙子",18)
print(id(test1),id(test1.name),test1.name)test2 = ExecSql("柚子",33)
print(id(test1),id(test1.name),test1.name)
print(id(test2),id(test2.name), test2.name)"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test02.py
实例化时优先调用new方法,创建实例对象,这个方法是实现单例
实例化时,初始化方法,初始化一些数据
2668768588352 2668766898976 橙子
实例化时优先调用new方法,创建实例对象,这个方法是实现单例
实例化时,初始化方法,初始化一些数据
2668768588352 2668768524368 柚子
2668768588352 2668768524368 柚子Process finished with exit code 0

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql添加用户及权限

一、增加权限 mysql> grant 权限1,权限2,...权限n on 数据库名称.表名称 to 用户名用户地址 identified by 连接口令; mysql>flush privileges; (刷新系统权限表) 权限1,权限2,...权限n代表select,insert,update,delete,create,drop,index,alter,grant,references,rel…

Python unittest中初始化固件setUp和销毁固件tearDown详解

unittest.TestCase 包含了 setUp() 和 tearDown() 两个方法,其中 setUp() 方法用于初始化测试固件;而 tearDown() 方法用于销毁测试固件。程序会在运行每个测试用例(以 test_ 开头的方法)之前自动执行 setUp() 方法来初始化测试固…

【Android】Android Studio中新创建的app目录结构

安装Android Studio后,然后创建一个app项目。对于初学者来说,我们希望了解app目录结构,然后更好的进行开发工作。 但是要想了解一个app的目录结构,首先需要明确两个概念 Project Name:工程项目名称 Application Name:当前app发布…

mysql添加用户权限报1064 - You have an error in your SQL syntax问题解决

mysql添加用户及权限报错: 出现这样错的原因有两个: 1、语法有问题 (这里没有问题) 2、mysql版本是否支持 此种写法 找到一位大神说:你检查下mysql版本是mysql server 8.不支持同时创建用户和授予权限&#xf…

Python Pytest前置setup和后置teardown详解

pytest用例运行级别: ●模块级(setup_module/teardown_module)开始于模块始末,全局的 ●函数级(setup_function/teardown_function)只对函数用例生效 ●类级(setup_class/teardown_class&#x…

【Python】pandas模块操作大型数据集

pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。 Pandas是python的一个数据分析包…

djangohttp://127.0.0.1:8000/media/test.jpg直接显示图片media配置

文件目录如下: 1、在settings中加入: STATIC_URL /static/ STATICFILES_DIRS (os.path.join(BASE_DIR,static),) #MEDIA_DIR (主要用于获取路径) MEDIA_DIR os.path.join(BASE_DIR,media) # 需要加入的MEDIA_DIR路径变量 #ME…

Python pytest框架之@pytest.fixture()和conftest详解

一、fixture简介 学pytest就不得不说fixture,fixture是pytest的精髓所在,类似unittest中setup/teardown这种前后置东西。但是比它们要强大、灵活很多,它的优势是可以跨文件共享 fixture的目的是提供一个固定基线,在该基线上测试可…

LInux下Ubuntu下查看端口占用及关闭

1、查看所有进程 ps -ef 或者 ps -aux a:显示所有程序 u:以用户为主的格式来显示 x:显示所有程序,不以终端机来区分 2、查看使用某端口的占用 lsof -i:8080 或者: netstat -ap|grep 8090 3、查看到进程id之后,使用netstat命令查看其占用的…

【Python】pandas模块中更改Series的数据类型

今天我们主要解决以下实际问题:一份黑名单数据存储在excel中,由于数据量庞大,现需要通过pandas找到某一列的重复数据,处理后再存入到excel中。 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的,主…

Python Pytest调用fixture之@pytest.mark.usefixtures()、叠加usefixtures、@pytest.fixture(autouse=True)用法详解

usefixtures与传fixture区别 如果fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。 当fixture需要用到return出来的参数时,只能讲参数名称直接当参数传入,不需要用到re…

ubuntu Django项目后台不挂断运行之screen命令

1、安装screen apt install screen 2、新建一个screen screen -S web这样就会新开一个窗口。cd到你需要的目录然后输入你想输入的命令。输入: python manage.py runserver 0.0.0.0:80 3、重新开一个窗口,列出所有screen进程 screen -ls4、如果之前的s…

【Python】Paramiko模块实现Linux服务器远程文件操作

ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。 有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对…

Python Pytest中fixture之yield唤醒teardown和终结函数addfinalizer

引入 我们之前学习的都是测试用例的前置固件,也就是相当于“setup”。说到这,细心的你可能想到了,那有没有什么方式可以表示出“teardown”?这就是我们今天学习的yield和addfinalizer。 yield yield是一个关键字,它不…

django项目时间与Ubuntu时间不一致

今天发布项目后才发现log时间和win10系统时间或者date不一致。 查了好多。 最后:是django项目中settings中时区的问题 在settings中默认为UTC时区,我们应转换为中国时区 即做一下修改: LANGUAGE_CODE zh-Hans TIME_ZONE Asia/Shanghai…

【Python】Paramiko模块在Windows10中import ssl报错的处理方法

上一篇文章【Python】Paramiko模块实现Linux服务器远程文件操作 介绍了如何通过Paramiko进行 sftp的操作,但最近遇到一个问题,换上家里的windows10电脑后,执行脚本时发现报错:\lib\site-packages\cryptography\hazmat\bindings\op…

【Jmeter篇】Linux环境下安装部署运行Jmeter

JDK安装和配置 1、使用yum线上安装jdk1.8 yum -y list java* #浏览线上所有jdk版本列表 yum -y list java-1.8*#浏览线上jdk1.7版本列表 yum -y install java-1.8.0-openjdk* #下载安装jdk1.8套件 java -version #检查是否安装成功 2、配置全局环境变量 which java ls -…

django项目连接远程数据库

1、远程数据库开放连接权限 如果连接错误,请考虑 1)用户添加访问其他ip权限 2)3306端口是否开放 3)阿里云服务器安全组规则是否添加3306端口 2、django项目中settings中的host填写远程数据库的公有ip,及填写远程数…

【Python实战】使用python批量生成发票

一般的贸易或者货运型公司,经常需要做发票,有时候我们会遇到需要做大批量重复性的发票时,如果人工一个个去做,即耗时而且容易出错,这时我们可以用的python和excel相关的模块去批量生成。 现在有这样一个场景&#xff…

【Jmeter篇】Jmeter踩坑记(一)

踩坑一: Response code: Non HTTP response code: java.net.SocketTimeoutException Response message: Non HTTP response message: connect timed out 查看Load time的时间要大于request设置的connect time out时间,所以抛出该异常。可能是由于服务端有…