设计模式之单例模式

设计模式是前辈们发明的经过反复验证用于解决固定问题的固定套路,在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模块的更多相关文章

  1. 设计模式---单例模式,pickle模块

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

  2. python模块(json和pickle模块)

    json和pickle模块,两个都是用于序列化的模块 • json模块,用于字符串与python数据类型之间的转换 • pickle模块,用于python特有类型与python数据类型之间的转换 两个 ...

  3. 【python】pickle模块

    持久性的基本思想很简单.假定有一个 Python 程序,它可能是一个管理日常待办事项的程序,您希望在多次执行这个程序之间可以保存应用程序对象(待办事项).换句话说,您希望将对象存储在磁盘上,便于以后检 ...

  4. python数据持久存储:pickle模块的基本使用

    经常遇到在Python程序运行中得到了一些字符串.列表.字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据. 这个时候Pickle模块就派上用场了,它可以将对象转换 ...

  5. python数据持久存储:pickle模块的使用

    python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...

  6. Python(正则 Time datatime os sys random json pickle模块)

    正则表达式: import re #导入模块名 p = re.compile(-]代表匹配0至9的任意一个数字, 所以这里的意思是对传进来的字符串进行匹配,如果这个字符串的开头第一个字符是数字,就代表 ...

  7. python--json & pickle 模块

    用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...

  8. python(6)- json和pickle模块

    这是用于序列化的两个模块: json: 用于字符串和python数据类型间进行转换 pickle: 用于python特有的类型和python的数据类型间进行转换 Json模块提供了四个功能:dumps ...

  9. pickle模块的基本使用

    pickle是python的biult-in模块: python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储 ...

随机推荐

  1. 内网穿透系列-Go语言

    一.介绍 软件在KCP出现后进行了重构,将其底层UDP支持替换为了KCP,使其效率大大提高,在某些恶劣的网络环境下依旧能有不错的效果.当然,它也是支持TCP模式的,另外它也是支持加密的,在P2P打洞失 ...

  2. 一个未知宽高的元素在div中垂直水平居中

    <body> <div id="#div1"> <img src="img1.png"></img> </ ...

  3. 学习webpack前的准备工作

    前言 由于vue和react的流行,webpack这个模块化打包工具也已经成为热门.作为前端工程师这个需要不断更新自己技术库的职业,真的需要潜下心来学习一下. 准备工作(针对mac用户) 安装 hom ...

  4. C# 委托专题

    单播委托:一个委托只指向一个方法: 多播委托:一个委托指向多个方法,形成一个方法链: Main是静态方法,里面只能引用静态方法,而不能引用实例方法: Main可以进行类的实例化,然后引用实例化后的方法 ...

  5. 微信支付之微信H5支付(坑,ajax不支持重定向跳转)

    这里讲的是  微信h5支付,    是微信以外的手机浏览器调用微信h5支付  h5支付: H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起 ...

  6. 微信小程序列表拖动排序Demo

    wxml页面编写 <view class="container"> <view bindtap="box" class="box&q ...

  7. C语言类型(上)

    前提说明 格式说明:以[signed] int 为例 表明该类型的完整表达是 signed int 只不过signed可以省略 所以 int 也代表 signed int 类型 signed和unsi ...

  8. Prometheus+Grafana安装搭建

    介绍 Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本. 2016年 ...

  9. Python学习报告及后续学习计划

    第一次有学习Python的想法是源于寒假在家的时候,高中同学问我是否学了Python(用于深度学习),当时就到b站收藏了黑马最新的教学视频,但是"收藏过等于我看了",后续就是过完年 ...

  10. 安卓记账本开发学习day8之导入外部依赖

    以要使用的柱状图分析显示为例,项目文件夹最外层的build.gradle,加入下列语句 allprojects { repositories { google() jcenter() maven { ...