通用技术 多个实例共享静态变量

陈子昂 · 2020年04月05日 · 1046 次阅读
小技巧

不光是 python 有这个,其他语言都可以,主要是思想,从网上复杂的程序框架里面抽丝出来的。
PS:new是就真正的构造函数,看打出来后默认占位是 cls 就了解载入时的状态了,init() 是就绪区域,实例化一个类的时候会装载一堆高阶函数,可以通过 dir 去查看。
这里只是覆写了。
验证是不是同一个类的不同实例,其中一个实例添加了对象后,其他实例将共享其静态区域的对象,用的是基础的 assert is 最后 driver 是== 。
包含一个动态添加的例子和一个 selenium driver 对象的例子(可以衍生到 appium driver,接口的 client 对象,工具的 agent/worker 等等)
不同语言优势和缺点都有不同的,通用缺点是内存一直会被占用,第一个动态添加变量的类被关闭后也不会被析构掉,并且效率上会稍微降低。
python 版本的 e.g

from selenium import webdriver
class Mono():
    """
    MonoDemo
    """
    _state = {}

    def __new__(cls, *args, **kwargs):
        obj = super(Mono, cls).__new__(cls, *args, **kwargs)
        obj.__dict__ = cls._state
        return obj

if __name__ == '__main__':
    m1 = Mono()
    m2 = Mono()
    assert m1 is not m2, "内存不是一块"
    m1.a = 100
    assert hasattr(m2,"a") == True,"m2实例里面有这个对象a"
    assert m2.a is m1.a, "内存结果是一块"
    m1.driver = webdriver.Chrome("chromedriver.exe配置的地址")
    m1.driver.quit() #只是演示
    assert hasattr(m2,"driver") == True,"m2实例里面有这个对象driver"
    #这里用==更符合语义
    print(m1.driver==m2.driver) #True 说明状态共用了

在 * 内存可控情况下,一个是共享变量让代码更灵活。
一个是前置行为(初始化 driver/client)在过程中 pageObject 或者门面模式等等业务装载到其他业务场景,避免实例化关键的 driver/client,有时候不了解其他人的框架内存生命周期,很容易后面的等于初始化了 driver/client 等,导致一些很诡异的错误产生。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册