设计模式之单例模式

设计模式是前辈们发明的经过反复验证用于解决固定问题的固定套路,在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. 纯CSS实现扁平化风格开关按钮

    开关样式预览图 前言 最近在基于bootstrap框架开发一个网站,在填写表单一项需要用户填写是否选择某一选项,本来想引用bootstrap框架自带的一个按钮插件,结果在引用js的时候总是出错,就找了 ...

  2. canvas 1px 出现模糊解决方法及原理

    关于canvas绘制1像素出现模糊的原因及解决方法 canvas是html5中非常强大的功能,但是在绘制的时候如果出现1像素,例如画一条1像素的线可能出现模糊情况. 一.解决方法 网上比较常见的解决方 ...

  3. es5语法下,javascript如何判断函数是new还是()调用

    es5语法没有支持类class,但是可以通关函数来申明一个类,如下: function Person(name){ this.name=name; } var john=new Person('joh ...

  4. js验证邮箱格式

    function test() { var temp = document.getElementById("text1"); //对电子邮件的验证 var myreg = /^([ ...

  5. 在vue中实现点击哪个哪个区域变化背景色和字体颜色,其他默认(uni-app框架中也可以使用)

    template: 1 <view class="wrap"> 2 <view class="total" :class="{ se ...

  6. 99-oracle-asmdevices.rules(udev方式创建asm磁盘)

    一.创建asm磁盘的几种方式 创建asm方式很多主要有以下几种 1.Faking方式 2.裸设备方式 3.udev方式(它下面有两种方式) 3.1 uuid方式. 3.2 raw方式(裸设备方式) 4 ...

  7. mongodb replication

    官方文档:https://docs.mongodb.com/manual/replication/ 启动参数: 通过linux的包管理器(例如:yum)安装的mongodb会产生一个默认的配置文件:/ ...

  8. Java学习day42

    继续刷力扣题

  9. Codeforces Round #721 (Div. 2)A. And Then There Were K(位运算,二进制) B1. Palindrome Game (easy version)(博弈论)

    半个月没看cf 手生了很多(手动大哭) Problem - A - Codeforces 题意 给定数字n, 求出最大数字k, 使得  n & (n−1) & (n−2) & ...

  10. docker进阶_dockerswarm

    DockerSwarm Docker Swarm简介 Docker Swarm的功能 ​ Docker Swarm包含两个方面:docker安全集群,以及一个微服务应用引擎 ​ 集群方面,swarm将 ...