ATX ATX UI 自动化学习-偏 python 语法知识

花开 · 2019年10月22日 · 最后由 simple 回复于 2019年10月22日 · 1989 次阅读

在学习ui自动化测试的时候看一下面这些文章, 遇到一个很有意思的python关键字 @classmethod和类属性这块. 当时比较迷惑和自己没有整体看完整,所以一直不明白为啥多个设备的并行driver不冲突.然后就学习了一下相关的知识.

类属性

这个属性是归类所有,可以直接通过class.xxx直接访问或修改, 这几个分享的driver都是通过这种方式保存和使用的. 如果想深入了解可以看这里关于 Python 类属性与实例属性的讨论

测试代码如下:

class BasePage(object):
    num = -1

    @classmethod
    def change_num(cls, num):
        cls.num = num


print("1: {}".format(BasePage.num))
BasePage.change_num(2)
print("2: {}".format(BasePage.num))

b = BasePage()
print("3: {}".format(b.num))

c = BasePage()
print("4: {}".format(c.num))
//output
1: -1
2: 2
3: 2
4: 2

使用多进程隔离类属性

这时候我们很清楚的看到这个属性是属于一个类的,为啥多设备的时候不冲突的,主要是以前一直使用java,首先的概念就是多设备并行就是多线程,直到看到的下面的代码:

然后我们把上面的代码使用多进程的方式修改一下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from multiprocessing import Pool


class BasePage(object):
    num = -1

    @classmethod
    def change_num(cls, num):
        cls.num = num

    @staticmethod
    def _pool(run):
        base_page = BasePage()
        base_page.change_num(run)
        print("num: {}".format(base_page.num))
        print("num: {}".format(BasePage.num))

if __name__ == "__main__":

    runs = [1, 2]
    pool = Pool(processes=len(runs))

    for run in runs:
        pool.apply_async(BasePage._pool,
                                 args=(run,))
    print('Waiting for all runs done........ ')
    pool.close()
    pool.join()
    print('All runs done........ ')
///output
Waiting for all runs done........
num: 1
num: 1
num: 2
num: 2
All runs done........

这时候发现上面的疑问莹然而解,然后这样也有一个好处,在任意的地方都可以直接获取driver进行操作.

看了一篇很好的文章也分享给大家:

共收到 1 条回复 时间 点赞

很棒的总结!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册