Python攻城师的成长————设计模式之单例模式(补充:pickle模块)

今日目标

  • 了解设计模式,按照自己的能力去掌握。


学习内容

  • 设计模式之单例模式

  • pickle模块


一、设计模式之单例模式

1.什么是单例模式

单例模式是一种经常使用的设计模式,使用该模式创建的类对象在整个系统中只有一个。在python中,使用id(实例名)可以看到多次创建该类的对象的id是相同的

2.什么时候适合使用单例模式

简而言之一句话,需要节省内存,加快对象访问速度以及对象需要被公用的场合
1.系统中配置文件的管理
2.应用程序的日志应用

3.python中单例模式的实现

  1. 通过模块实现单例模式(最简单的实现方式)

    原理:python的模块其实是一个非常好的自带单例模式,python的模块在导入时会生成.pyc文件,在后面再次导入该模块时,会加载.pyc文件

    class Singleton(object):
    	pass
    
    s = Singleton()
    

    上述文件中就存在了一个Singleton类的实例s,在使用时,通过from singleton import s导入这个实例,就可以获得这个使用这个单例,同时它也是一个单例模式的对象

  2. 通过改写__new__方法实现(推荐使用该方法)

    原理:在python的类创建对象的过程中,先通过__new__方法实例化一个对象(PS:在没有自己定义该方法时会默认调用object.new),然后才执行__init__方法对实例化的对象进行各项初始化复制操作。

  3. 基于指定metaclass实现

    原理:这个解释起来源远流长,可以针对元类单独写一篇博客了,这里就简单说明一下。类其实也是一个对象,创建类的类就是元类,大致可以理解为:MyClass = MetaClass(),MyObject = MyClass(),其中MetaClass就是一个元类,是创建MyClass这个实例(对于MyObject来说它又是一个类,注意区别理解)的类。在python中默认的元类是一个强大的函数type。

    class Single(type):
    	new_obj = None
    
    	def __call__(self, *args, **kwargs):
        	if not self.new_obj:
            	obj = super().__call__(*args, **kwargs)
            	self.new_obj = obj
            	return self.new_obj
        	return self.new_obj
    
    
    class MyClass(metaclass=Single):
    	def __init__(self, name):
        	self.name = name
    
    
    obj1 = MyClass('jason')
    obj2 = MyClass('tony')
    print(id(obj1), id(obj2))
    print(obj1.__dict__, obj2.__dict__)
    
    
    '''
    # 执行结果
    2093212036832 2093212036832
    {'name': 'jason'} {'name': 'jason'}
    '''
    
  4. 使用装饰器

    def log(func):
    	def wrapper(*args, **kwargs):
       		return func(*args, **kwargs)
    	return log
    
    
    @log
    def f():
     pass
    
  5. 使用类
    原理:使用类成员,类成员是该类所有实例共有的属性

二、pickle模块

1.什么是pickle模块

pickle模块使用的数据格式是python专用的,能够把Python对象直接保存到文件,而不须要把他们转化为字符串,也不用底层的文件访问操作把它们写入到一个二进制文件中。

2.Pickle模块中最常用的函数

  1. pickle.dump(obj, file, [,protocol])
    函数的功能:接受一个文件句柄和一个数据对象作为參数,把数据对象obj以特定的格式保存到给定的文件file里。

    import pickle
    l1=[1,2,3,4,5]
    t1=(1,2,3,4,5)
    dic1={"k1":"v1","k2":"v2","k3":"v3"}
    #把列表l1序列化进一个文件f1中
    with open("f1","wb") as f:
    	pickle.dump(l1,f)
    	pickle.dump(t1,f)
    	pickle.dump(dic1,f)
    
    序列化后在当前目录下生成一个f1文件,打开文件f1可以看到一堆乱码,如下所示:
    €]q (KKKKKe.(KKKKKtq .}q (X   k1qX   v1qX   k2qX   v2qX   k3qX   v3qu.
    
    
  2. pickle.load(file)
    函数的功能:将file中的对象序列化读出。

    import pickle
    #序列化到文件
    obj = 123, "abcdedf", ["ac", 123], {"key": "value", "key1": "value1"}
    print(obj)
    #wb 读写到二进制文件
    f = open("./a.txt",'wb')
    pickle.dump(obj,f)
    f.close()
    f = open("./a.txt",'rb')
    print(pickle.load(f))
    f.close()
    
    
  3. pickle.dumps(obj[, protocol])
    函数的功能:将obj对象序列化为string形式,而不是存入文件中。

    import pickle
    ls = ['12', '34', '56']
    # dumps 将数据通过特殊的形式转换为只有python语言认识的字符串
    str = pickle.dumps(ls)
    print(str)  	
    
  4. pickle.loads(string)
    函数的功能:从string中读出序列化前的obj对象。

    import pickle
    # loads  将pickle数据转换为python的数据结构
    ls = ['12', '34', '56']
    str = pickle.dumps(ls)
    mes = pickle.loads(str)
    print(mes)
    ['aa', 'bb', 'cc']
    
    

总结

  • 设计模式是前辈们发明的经过反复验证用于解决固定问题的固定套路,所以自己在之后可以去学习其他22种模式,尽量去理解一些解决问题的思维逻辑
  • 了解Pickle模块用法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值