单例模式与pickle模块
设计模式之单例模式
设计模式是前辈们发明的经过反复验证用于解决固定问题的固定套路,在IT行业中设计模式总共有23种,可以分为三大类:创建型、结构型、行为型。这里不做详细的讲解。
单例模式
单例模式是设计模式中的其中一种,目的是让多次实例化结果指向同一个实例,简单的来说就是让一个类只能产生一个对象,用于节省资源。
比如此时我有一个类了,因为我不知道这个类是否已经产生对象了,往往会去在创建一个新对象,这时就有可能造成资源的浪费了。
单例模式有多种编写方式,这里只写出部分编写方式:
1.基于@classmethod
class MyClass(object):
obj = None
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def singleton(cls, name, age):
if not cls.obj:
cls.obj = cls(name, age)
return cls.obj
obj1 = MyClass.singleton('tom', 18)
obj2 = MyClass.singleton('jack', 28)
print(obj1.__dict__) # 输出:{'name': 'tom', 'age': 18}
print(obj2.__dict__) # 输出:{'name': 'tom', 'age': 18}
print(obj1 is obj2) # 输出:True
2.基于装饰器
def singleton(cls):
obj = None
def inner(*args, **kwargs):
nonlocal obj
if obj:
return obj
obj = cls(*args, **kwargs)
return obj
return inner
@singleton
class MyClass:
def __init__(self, name, age):
self.name = name
self.age = age
obj1 = MyClass('tom', 18)
obj2 = MyClass('jack', 28)
print(obj1.__dict__) # 输出:{'name': 'tom', 'age': 18}
print(obj2.__dict__) # 输出:{'name': 'tom', 'age': 18}
print(obj1 is obj2) # 输出:True
3.基于元类
class Mymeta(type):
def __call__(cls, *args, **kwargs):
if cls.obj:
return cls.obj
obj = super().__call__(*args, **kwargs)
cls.obj = obj
return obj
class MyClass(metaclass=Mymeta):
# 用来确认是否创建过对象
obj = None
def __init__(self, name, age):
self.name = name
self.age = age
obj1 = MyClass('tom', 18)
obj2 = MyClass('jack', 28)
print(obj1.__dict__) # 输出:{'name': 'tom', 'age': 18}
print(obj2.__dict__) # 输出:{'name': 'tom', 'age': 18}
print(obj1 is obj2) # 输出:True
4.基于__new__
class MyClass(object):
obj = None
def __init__(self, name, age):
self.name = name
self.age = age
def __new__(cls, *args, **kwargs):
if not cls.obj:
cls.obj = object.__new__(cls)
return cls.obj
obj1 = MyClass('tom', 18)
obj2 = MyClass('jack', 28)
print(obj1.__dict__) # 输出:{'name': 'jack', 'age': 28}
print(obj2.__dict__) # 输出:{'name': 'jack', 'age': 28}
print(obj1 is obj2) # 输出:True
5.基于模块
# 单独在一个py文件中定义一个类,并实例化一个对象,之后在其他文件导入这一对象,实现单例
class Singleton(object):
def __init__(self,host,port):
self.host = host
self.port = port
# 之后都导入这个对象即可
singleton = Singleton('127.0.0.1',3306)
实现单例模式的方式不固定,方式有很多,这里只列出其中的几种。
pickle模块
pickle模块基本不会去被使用,兼容性太差,一般都使用ORM替代pickle。
pickle模块可以将对象保存到文件中,并且可以取出后继续使用。
将对象保存到文件中:
import pickle
class MyClass(object):
def __init__(self, name):
self.name = name
def eat(self):
print('%s正在干饭' % self.name)
obj = MyClass('tom')
# 将对象存到文件中
with open(r'%s' % obj.name, 'wb') as f:
pickle.dump(obj, f)
从文件中获取对象:
import pickle
class MyClass(object):
def __init__(self, name):
self.name = name
def eat(self):
print('%s正在干饭' % self.name)
# 将对象从文件中取出来
with open(r'tom', 'rb') as f:
obj = pickle.load(f)
print(obj) # 输出:<__main__.MyClass object at 0x00000183EC49CFD0>
print(obj.name) # 输出:tom
obj.eat() # 输出:tom正在干饭
单例模式与pickle模块的更多相关文章
- 设计模式---单例模式,pickle模块
设计模式---单例模式 简介 单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实 例存在.当你希望在整个系统中,某个类只能出现一个实例时 ...
- python模块(json和pickle模块)
json和pickle模块,两个都是用于序列化的模块 • json模块,用于字符串与python数据类型之间的转换 • pickle模块,用于python特有类型与python数据类型之间的转换 两个 ...
- 【python】pickle模块
持久性的基本思想很简单.假定有一个 Python 程序,它可能是一个管理日常待办事项的程序,您希望在多次执行这个程序之间可以保存应用程序对象(待办事项).换句话说,您希望将对象存储在磁盘上,便于以后检 ...
- python数据持久存储:pickle模块的基本使用
经常遇到在Python程序运行中得到了一些字符串.列表.字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据. 这个时候Pickle模块就派上用场了,它可以将对象转换 ...
- python数据持久存储:pickle模块的使用
python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...
- Python(正则 Time datatime os sys random json pickle模块)
正则表达式: import re #导入模块名 p = re.compile(-]代表匹配0至9的任意一个数字, 所以这里的意思是对传进来的字符串进行匹配,如果这个字符串的开头第一个字符是数字,就代表 ...
- python--json & pickle 模块
用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...
- python(6)- json和pickle模块
这是用于序列化的两个模块: json: 用于字符串和python数据类型间进行转换 pickle: 用于python特有的类型和python的数据类型间进行转换 Json模块提供了四个功能:dumps ...
- pickle模块的基本使用
pickle是python的biult-in模块: python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储 ...
随机推荐
- android JS 互相通讯
1.android中利用webview调用网页上的js代码. Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true ...
- Py的A+B
程序会读入两行,每行都是一个数字,输出这两个数字的和 输入格式: 两行文字,每行都是一个数字 输出格式: 一行数字 输入样例: 18 21 输出样例: 39 代码: a = input() b = i ...
- Java/C++实现观察者模式--股票价格
当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时会大哭一场. 类图: Java代码: public class Investor implemen ...
- 以&#开头的是什么编码?
今天遇到了一个网页时繁体的,它的title和meta信息在浏览器中显示正常,但是查看其源码是却是"最新發"这种. 在网上找了半天资料,终于搞明白了. 以在网页中&#开头的是 ...
- vue引入echarts
效果图: 1.安装Echarts : npm install echarts -S 或者使用国内的淘宝镜像: 安装: npm install -g cnpm --registry=https: ...
- EMS已有用户分配邮箱方法
案例任务:已有域用户"test100",为该用户分配邮箱. 分配邮箱前,使用"get-user"命令确认用户类型.域用户"test100"的 ...
- vue过滤金额自动补全小数点
watch:{ //监听input双向绑定 balance(value) { //保留2位小数点过滤器 不四舍五入 var toFixedNum = Number(value).toFixed(3); ...
- Linux上部署net6应用
前言 .net6都出来了,作为一名.net搬砖工却一直都在windows下部署应用,还未尝试过linux环境下部署应用.参考福禄网络研发团队的相关博客,学习一下如何将应用部署到linux系统. . ...
- 麒麟系统开发笔记(三):从Qt源码编译安装之编译安装Qt5.12
前言 上一篇,是使用Qt提供的安装包安装的,有些场景需要使用到从源码编译的Qt,所以本篇如何在银河麒麟系统V4上编译Qt5.12源码. 银河麒麟V4版本 系统版本: Qt源码下载 ...
- thymeleaf模板使用
使用模板页面,实现在同一个页面展现不同数据,controller实现页面跳转的时候就不在需要打开新页面