单例模式、pickle模块

单例模式实现的多种方式

简介:单例模式可以保证一个类仅有一个实例,并提供一个访问它的全局访问点。适用性于当类只能有一个实例而且客户可以从一个众所周知的访问点访问它,例如访问数据库、MQ等。
1通过使用类实现
class C1(object):
__instance=None
def __init__(self,name,age):
self.name=name
self.age=age
@classmethod
def singleton(cls):
if not cls.__instance:
cls.__instance=cls('jason',11)
return cls.__instance
obj1=C1.singleton()
obj2=C1.singleton()
obj3=C1.singleton()
print(id(obj1),id(obj2),id(obj3))
obj4=C1('猴子',16)
obj5=C1('猪',12)
print(id(obj4),id(obj5))
基于__new__方法实现
ass Mumeta(type):
def __init__(self,name,bases,dic):
self.__instance=object.__new__(self)
self.__init__(self.__instance,'jason',18)
super().__init__(name,bases,dic)
def __call__(self, *args, **kwargs):
if args or kwargs:
obj=object.__new__(self)
self.__init__(obj,*args,**kwargs)
return obj
return self.__instance
class Mysql(metaclass=Mumeta):
def __init__(self,name,age):
self.name=name
self.age=age
obj1=Mysql()
obj2=Mysql()
print(id(obj1),id(obj2))#2480571889264 2480571889264
obj3=Mysql('猪猪',12)
obj4=Mysql('丫丫',21)
print(id(obj4),id(obj3))#2480572568144 2480572567952
'''基于模块的单例模式:提前产生一个对象 之后导模块使用'''
def outer(cls):
_instance=cls('jason',12)
def inner(*args,**kwargs):
if args or kwargs:
obj=cls(*args,**kwargs)
return obj
return _instance
return inner
@outer
class Mysql:
def __init__(self,host,port):
self.host=host
self.port=port
obj1=Mysql()
obj2=Mysql()
obj3=Mysql()
print(obj1 is obj2 is obj3)#True
obj4=Mysql('1.2.3.4',123)
obj5=Mysql('4.3.2.1',321)
print(id(obj4),id(obj5))#2152130515104 2152130515200

pickle序列化模块

pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化,
优势:能够序列化python中所有的类型
缺陷:只能够在python中使用 无法跨语言传输
需求:产生一个对象并保存到文件中 取出来还是一个对象
"""
需求:产生一个对象并保存到文件中 取出来还是一个对象
"""
class C1:
def __init__(self, name, age):
self.name = name
self.age = age
def func1(self):
print('from func1')
def func2(self):
print('from func2')
obj = C1('jason', 18)
# import json
# with open(r'a.txt','w',encoding='utf8') as f:
# json.dump(obj, f)
# import pickle
# with open(r'a.txt', 'wb') as f:
# pickle.dump(obj, f)
# with open(r'a.txt','rb') as f:
# data = pickle.load(f)
# print(data)
# data.func1()
# data.func2()
# print(data.name)
posted @   冰柠檬檬  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示