Python下简易的单例模式详解
作者:whyfive4 发布时间:2022-02-15 10:03:19
标签:Python,单例模式
Python 下的单例模式
要点:
1.某个类只能有一个实例;
2.它必须自行创建这个实例;
3.它必须自行向整个系统提供这个实例
方法:重写new函数
应该考虑的情况:
1.这个单例的类可能继承了别的类
2.这个单例的类还有可能要接收参数来实例化
要点:
实例化的过程其实不是直接调用init的,首先是new分配一块空间来创建实例,再由init对这个实例进行初始化.我们无法阻止new和init的调用,我们只能是限制他们的内容,以此使他们能达到单例的目的
代码:
class people(object):
def __new__(cls,*args,**kargs):
return super(people,cls).__new__(cls)
def __init__(self,name):
self.name = name
def talk(self):
print("hello,I am %s" %self.name)
class student(people):
def __new__(cls,*args,**kargs):
if not hasattr(cls,"instance"):
cls.instance = super(student,cls).__new__(cls,*args,**kargs)
return cls.instance
a = student("Timo")
print(a)
b = student("kysa")
c = student("Luyi")
a.talk()
b.talk()
print(c)
这里的输出结果是:
<__main__.student object at 0x0000025AC48BF2E8>
hello,I am Luyi
hello,I am Luyi
<__main__.student object at 0x0000025AC48BF2E8>
可以确定的是: 确实是单例了,因为a的id和b,c的id是一致的
但是为什么:a先创建明明是Timo,可是为什么a的name变成了Luyi呢?
原因:
虽然确实是a这个实例,但是在最后c重新调用了new,返回了a的实例,再经过init,改变了a的属性,执行时name ->Luyi.
解决:
这种情况下,我们只需要设置类变量,让init在类变量的限制下,只对类进行一次有效的初始化.
代码:
class people(object):
def __new__(cls,*args,**kargs):
return super(people,cls).__new__(cls)
def __init__(self,name):
self.name = name
def talk(self):
print("hello,I am %s" %self.name)
class student(people):
def __new__(cls,*args,**kargs):
if not hasattr(cls,"instance"):
cls.instance = super(student,cls).__new__(cls,*args,**kargs)
return cls.instance
def __init__(self,name):
if not hasattr(self,"init_fir"):
self.init_fir = True
super(student,self).__init__(name)
a = student("Timo")
print(a)
b = student("kysa")
c = student("Luyi")
a.talk()
b.talk()
print(c)
好了,到这里就用Python实现了一个简易的单例模式.
以上所述是小编给大家介绍的Python下简易的单例模式详解整合网站的支持!
来源:https://blog.csdn.net/whyfive4/article/details/89048773


猜你喜欢
- 在 AbpBase.Database 中,通过 Nuget 添加以下几个库:版本都是 1.9.0-preview0917
- 问题背景VSCode是我们开发go程序的常用工具,但是安装VSCode成功后,创建一个.go文件会有如下提示:这个是vscode提示你需要安
- 前段时间,微信群有一个朋友问了下面这个问题,虽然很简单,但是觉得有必要和大家做一个知识分享。这个问题一共有两个需求:① 获取视频的文件大小;
- Python中print()函数的方法是打印指定的内容。在交互环境中输入“help(print)”指
- 本文所用环境:Python 3.6.5 |Anaconda custom (64-bit)|引言由于某些原因,需要用python读取二进制文
- #1042 - Can't get hostname for your address 使用IP链接或域名链接都可能遇到
- 1.图像金字塔①高斯金字塔向下采样,数据会越来越少,减少的方式是:将偶数行和列删除向上采样,数据会越来越多,将图像在每个方向上扩大为原来的两
- 修改文件的名字 使用“FileSystemObject(文件系统对象)”的GetFile函数得到一个“文件对象”,然后修改这个“文件对象”的
- 生生把写过的java版改成javascript版,第一次写,很不专业,见谅。唉,我是有多闲。var Sudoku = { &nbs
- 前言最近项目中遇到一个用于监控日志文件的Python包pyinotify,结合自己的项目经验和网上的一些资料总结一下,总的原理是利用pyin
- 由于一些不可预测的因素,必须使用python2.7进行开发,所以研究了一下怎么在Anaconda3下建立2.7的开发环境,发现十分方便,在此
- 以前经常吃公司旁边的食堂,人多,排队。夏天的时候,我们总要找一个靠窗口通风好的地方坐,没有空调只有风扇,风扇很多,开关都集中在一个地方,应该
- 为什么会出现黏包现象:首先只有在TCP协议中才会出现黏包现象,是因为TCP协议是面向流的协议,在发送的数据传输的过程中还有缓存机制来避免数据
- urllib3是一款Python 3的HTTP客户端。Python标准库提供了urllib。在Python 2中,另外提供了urllib2;
- 关于Jmeter性能测试工具不再过多介绍。如果你要学习软件性能测试,那么多少应该会对它有所耳闻。强烈建议阅读官方文档学习:http://jm
- 关于php的引用(就是在变量或者函数、对象等前面加上&符号)的作用,我们先看下面这个程序。<?php
- Python 类Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用
- 1. 前言在SQL开发当中,多表联查是绝对绕不开的一种技能。同样的查询结果不同的写法其运行效率也是千差万别。在实际开发当中,我见过(好像还写
- 1、pyecharts绘制饼图(显示百分比)# 导入模块from pyecharts import options as optsfrom
- 爬虫是大家公认的入门Python最好方式,没有之一。虽然Python有很多应用的方向,但爬虫对于新手小白而言更友好,原理也更简单,几行代码就