单例模式

python

单例模式

1、什么是单例模式

  让所有类在实例化时,指向同一个内存地址,称之为单例模式              PS:无论产生多少个对象,都会指向 单个 实例

 

  当在确定 "类中的属性与方法不变" 需要反复调用类时,会产生不同的对象,也会产生不同的内存地址,最终造成资源的浪费,如下例:

class Foo:

def__init__(self, x, y):

self.x = x

self.y = y

foo_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 = host

self.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

回到顶部