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

 

posted @ 2021-10-12 17:33  金山毒霸  阅读(46)  评论(0)    收藏  举报