python中的单例模式
自动化测试代码中,相同测试用例每次执行都会打开一个浏览器,执行完成后关闭
可不可以只要打开一个浏览器,执行所有的用例
查找了相关资料,大部分答案都指向代码设计-单例模式
python类实例化后都会分配不同的内存id
class Test01: def __init__(self): print("实例化对象id:%s"%(id(self))) a=Test01() b=Test01() 输出结果: 实例化对象id:1645351455304 实例化对象id:1645351455752
Python类实例化先执行__new__方法分配内存空间,__new__方法返回实例对象的引用给__init__方法
class Test01: def __new__(cls, *args, **kwargs): print("分配实例对象内存,返回引用给__init__") def __init__(self): print("接收__new__返回实例对象的引用,开始执行构造方法") t=Test01() 输出结果: 分配实例对象内存,返回引用给__init__ Process finished with exit code 0
发现并未执行__init__构造方法,原因是没有__new__没有返回实例对象的引用
加上return super().__new__(cls)
class Test01: def __new__(cls, *args, **kwargs): print("分配实例对象内存,返回引用给__init__") return super().__new__(cls) def __init__(self): print("接收__new__返回实例对象的引用,开始执行构造方法") t=Test01() 输出结果: 分配实例对象内存,返回引用给__init__ 接收__new__返回实例对象的引用,开始执行构造方法
重写__new__方法并不能实现单例模式,两个实例对象使用的还是不同的内存id
class Test01: def __new__(cls, *args, **kwargs): print("分配实例对象内存,返回引用给__init__") return super().__new__(cls) def __init__(self): print("接收__new__返回实例对象的引用,开始执行构造方法") a=Test01() b=Test01() print(id(a)) print(id(b)) 输出结果: 分配实例对象内存,返回引用给__init__ 接收__new__返回实例对象的引用,开始执行构造方法 分配实例对象内存,返回引用给__init__ 接收__new__返回实例对象的引用,开始执行构造方法 3004873100680 3004873100488
首先要判断当前类是否有实例对象,假如已经有实例对象,直接传已有实例对象id给__init__进行实例化
class Test01: __instance=None def __new__(cls, *args, **kwargs): if cls.__instance is None: print("分配实例对象内存,返回引用给__init__") __instance=super().__new__(cls) return cls.__instance def __init__(self): print("接收__new__返回实例对象的引用,开始执行构造方法") a=Test01() b=Test01() print(id(a)) print(id(b)) 输出结果: 分配实例对象内存,返回引用给__init__ 分配实例对象内存,返回引用给__init__ 140715799690464 140715799690464