单例模式实现的多种方式
| 简介:单例模式可以保证一个类仅有一个实例,并提供一个访问它的全局访问点。适用性于当类只能有一个实例而且客户可以从一个众所周知的访问点访问它,例如访问数据库、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)) |
| obj3=Mysql('猪猪',12) |
| obj4=Mysql('丫丫',21) |
| print(id(obj4),id(obj3)) |
| '''基于模块的单例模式:提前产生一个对象 之后导模块使用''' |
| 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) |
| obj4=Mysql('1.2.3.4',123) |
| obj5=Mysql('4.3.2.1',321) |
| print(id(obj4),id(obj5)) |
| |
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) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端