设计模式之单例模式

设计模式是前辈们发明的经过反复验证用于解决固定问题的固定套路,在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. 在网页中预览excel表格文件

    项目需求在前端页面中实现预览excel表格的功能,上网了解之后大致总结为一下几种方法. 1.office文档转换为pdf,再转swf,然后通过网页加载flash进行预览 2.通过 xlsx.js,js ...

  2. 如何监控微信小程序HTTP请求错误

    摘要: Fundebug的微信小程序错误监控插件更新至0.5.0,支持监控HTTP请求错误. 接入插件 接入Fundebug的错误监控插件非常简单,只需要下载fundebug.0.5.0.min.js ...

  3. msmpeng.exe阻止移动硬盘弹出

    MsMpEng.exe 占用 该进程是微软反恶意软件服务的一个可执行文件,用户无法手动停止该进程. 首先运行   eventvwr.msc打开事件查看器,找到警告信息,查看是什么进程在阻止硬盘弹出. ...

  4. java中Number Type Casting(数字类型强转)的用法

    4.5 Number Type Casting(数字类型强转)隐式 casting(from small to big) byte a = 111; int b = a;显式 casting(from ...

  5. 自定义API(Jar包)的创建与使用(简单实现案例)

    @ 目录 学习内容 1. 自定义工具类 2. 导出jar 3. 加载Jar包 4. 调用自定义的API方法 总结 学习内容 1. 自定义工具类 新建一个java项目,然后创建包和工具类StringUt ...

  6. 小程序tab栏可滑动,可点击居中demo

    效果图: 代码: <view class="container"> <!-- tab导航栏 --> <!-- scroll-left属性可以控制滚动条 ...

  7. MySQL 8 数据源配置

    参考文档 官方文档 https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-overview.html 官方文档(PDF版)下载地址:http ...

  8. eclipse项目导入工作空间提示已存在问题

    项目直接放在 workspace 目录下,必须项目名和项目文件夹名相同,主要找的是eclipse 项目文件夹下的 .project 文件中的 <name> ... </name> ...

  9. vue elementUI 之 this.$confirm 用法

      this.$confirm('您确定退出当前账号吗?', '提示', {                         confirmButtonText: '确定',             ...

  10. .NET MAUI RC 是完整的 API 并准备好起飞 (GA)

    2022年4月12日 微软发布了 .NET Multiplatform App UI (.NET MAUI) 作为候选版本RC ,具体参见 https://devblogs.microsoft.com ...