python实现单例模式
2024-09-04 09:42:45
有这么一种场景,我们把数据封装到类体或类的某个方法里,然而我们new出这个类只是为了拿到这部分数据,那么当多次这样调用的时候,每次都来拿数据并放到内存中大大浪费了内存。
那我们就可以想,我们拿到一次数据以后,把它放到内存里,下次要用同样的时候做个判断,如果内存里有,那么就不用再取了。
这个时候就要设计一种“单实例模式”。
方法1:
class Foo(object):
__instance = None def __new__(cls, *args, **kwargs):
"""
单例模式
:param cls:
:param args:
:param kwargs:
:return:
"""
# 注意此处的判断,当cls.__instance为None时,才去真正的new,否则直接返回。
if not cls.__instance:
obj = object.__new__(cls, *args, **kwargs)
cls.__instance = obj
return cls.__instance object = Foo() # 先调用__new__,再调用__init__,__init__就类似于构造器。
在此也要补充一下,python创造类的实例,其实和java一样,都叫new出来的,只不过Python是将这个new方法写成内置的了(__new__),那我们也可以知道,当写object = Foo()时,先调的__new__,再调的__init__。
方法二:
class Foo(object):
instance = None def __init__(self):
self.name = 'haha'
# 其实和方法一的一个道理,建议用方法一。
@classmethod
def get_instance(cls):
if Foo.instance:
return Foo.instance
else:
Foo.instance = Foo()
return Foo.instance def process(self):
return ''
最新文章
- java DMO及增删改查代码的自动生成
- selenium webdriver自动化对日期控件的处理
- Vigenère 密码(luogu 1079)
- Date and Time in PeopleCode
- r个有标志的球放进n个不同的盒子里,要求无一空盒,问有多少种不同的分配方案?
- mysql配置优化
- js的原型继承小结
- CodeForces 486C Palindrome Transformation 贪心+抽象问题本质
- Tyvj P1813 [JSOI2008]海战训练
- Linux文件系统的层级结构
- 记一次python的一些参数
- 【kmp】 剪花布条 HDU - 2087
- ArcGIS对SLD样式的支持
- PDO和MySQLi区别与选择?
- 范式及其在mysql数据库设计中的应用
- Java 获取最近时间
- Codeforces 946D - Timetable (预处理+分组背包)
- drupal 7 安装失败后的补救办法
- nodejs读取excel内容批量替换并生成新的html和新excel对照文件
- Codeforces #345div1 C Table Compression (650C) 并查集