单例模式
单例模式
1、什么是单例模式
让所有类在实例化时,指向同一个内存地址,称之为单例模式 PS:无论产生多少个对象,都会指向 单个 实例
当在确定 "类中的属性与方法不变" 需要反复调用类时,会产生不同的对象,也会产生不同的内存地址,最终造成资源的浪费,如下例:
class Foo:def__init__(self, x, y): self.x
= x self.y
= yfoo_obj1
= Foo(10, 20)print(foo_obj1.__dict__)print(foo_obj1)foo_obj2
= Foo(10, 20)print(foo_obj2.__dict__)print(foo_obj2)
执行结果:
# foo_obj1和foo_obj2调用的属性相同,但内存地址不同{"x": 10, "y": 20}
<__main__.Foo object at 0x0000000001E662C8> # foo_obj1的内存地址{"x": 10, "y": 20}
<__main__.Foo object at 0x0000000001E66408> # foo_obj2的内存地址
使用多个内存地址即浪费内存空间。
2、单例模式的优点
可以节省内存空间
3、单例模式实现方法
实现方法(*****):
1) 通过classmethod实现
2) 通过装饰器实现
3) 通过__new__实现
4) 通过导入模块时实现
5) 通过元类实现
例:假如数据库被多台服务器调用启动和关闭(使用classmethod实现)
class MySql:# 定义一个属性默认值,用于判断对象是否存在, 若对象不存在,属性值默认是None# __instance是类的属性
__instance = None
def__init__(self, host, port):self.host
= hostself.port
= port@classmethod
def singleton(cls, host, port): # 单例方法 --> 类方法# 判断__instance中若没有值,证明没有对象
ifnot cls.__instance:
# 产生一个对象并返回
obj = cls(host, port)
# 从 None --> obj
cls.__instance = obj
# 若__instance有值,证明对象已经存在,则直接返回该对象
return cls.__instance
def start_mysql(self):
print("启动数据库。")
def stop_mysql(self):
print("关闭数据库。")
HOST1 = "192.168.9.1"
PORT1 = "1532"
HOST2 = "192.168.9.2"
PORT2 = "1533"
HOST3 = "192.168.9.3"
PORT3 = "1534"
obj1 = MySql.singleton(HOST1, PORT1)
obj2 = MySql.singleton(HOST2, PORT2)
obj3 = MySql.singleton(HOST3, PORT3)
print(obj1)
print(obj2)
print(obj3)
执行结果:
# obj1、obj2、obj3调用的属性相同,内存地址也相同<__main__.MySql object at 0x00000000021D6D48> # obj1的内存地址
<__main__.MySql object at 0x00000000021D6D48> # obj2的内存地址
<__main__.MySql object at 0x00000000021D6D48> # obj3的内存地址
使用同一个内存地址即节省内存空间。
以上是 单例模式 的全部内容, 来源链接: utcz.com/z/530197.html