Python 单例模式

Python 单例模式

在众多设计模式中,单例模式对于在测试开发过程中应用的还是比较广泛的,例如log, driver实例等。都需要使用到我们的单例模式

什么是单例模式?

用我自己的理解的话语来说:“单例模式就是如果一个地方都需要用到这个东西(对象),那么我们只需要创建一次就可以实现维护全局状态的使用”。就是我声明了在用的时候只需还是最初的那个即可,无需再次创建!

应用常见场景

单例模式一般用于对于共享资源的并发访问, 例如:数据库的连接, 日志的生成, 全局的工具对于测试而言就是我们的driver实例化。

代码解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
"""
因为单例模式在全局内只有一个实例,因此可以节省比较多的内存空间。
全局只有一个接入点,可以更好地进行数据同步控制,避免多重占用。
"""

"""
函数装饰器实现
"""


def sinleton(cls):
# 创建一个字典用来保存被装饰类的实例对象
_instance = {}

def _singleton(*args, **kwargs):
# 判断这个类有没有创建过对象, 没有就新创建一个, 有的话则返回之前创建的
if cls not in _instance:
_instance[cls] = cls(*args, **kwargs)
return _instance[cls]

return _singleton


@sinleton
class A(object):
def __init__(self, a=0):
self.a = a


a1 = A(1)
a2 = A(2)
print(id(a1), id(a2)) # 135962997305040 135962997305040

可以看出上述的id 是一致的也就是我们实现了单例模式。

下面以初始化driver为例来展示实际应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from selenium import webdriver

class SeleniumSingleton:
_instance = None

def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__new__(cls)
options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
cls._instance._driver = webdriver.Chrome(options=options)
return cls._instance

def __getattr__(self, name):
return getattr(self._driver, name)

上述代码解释:

_instance = None:这是一个类属性,用于存储唯一的实例。它初始值为 None,表示还没有创建实例。

new(cls, *args, **kwargs):这是 Python 类中的一个特殊方法,用于创建类的实例。这个方法被重写,确保只创建一次实例。

如果 _instance 为 None,说明还没有创建实例,则创建一个新的 SeleniumSingleton 实例并赋给 _instance。
然后,创建 webdriver.Chrome 实例,并将其保存到 _instance._driver 属性中。
最后,返回 _instance。
getattr(self, name):这个方法用于处理属性访问。当使用 SeleniumSingleton 实例访问属性时,它会调用这个方法。

它从 self._driver 属性中获取对应属性,并返回给调用者。

代码的用途:

这段代码通过单例模式,确保只创建一次 Selenium WebDriver 实例。这样,在不同的地方使用 Selenium WebDriver 时,都可以访问同一个实例,避免重复创建,提高代码效率。

总结

单例模式在程序编写中有广泛的应用,大家可以把我这个设计模式,做到更加高效的开发!


Python 单例模式
https://dreamshao.github.io/2024/08/02/python单例模式/
作者
Yun Shao
发布于
2024年8月2日
许可协议