暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python反射机制详解

自动化测试知识分享 2022-08-12
1091

反射简介

  • 反射就是通过指定的字符串(即关键字),从而获取对象中的方法或属性。反射在自动化测试中有非常广泛的应用,是关键字驱动框架的基础。Python中实现反射主要通过以下4个内置函数来完成:

    • hasattr:判断对象中是否有和关键字相匹配的属性或方法

    • getattr:获取对象中和关键字相匹配的属性或方法

    • setattr:设置对象中和关键字相匹配的属性值

    • delattr:删除对象中和关键字相匹配的属性或方法

反射函数

    在关键字驱动框架中,常用的函数就两个:hasattr和getattr,本文也只介绍这两个函数。

  • 数据准备--测试类和对象

      • class Reflect:
        def __init__(self):
        self.name = "zhangsan"
        self.color = '红色'
        def eat(self):
        print("{}正在吃{}苹果".format(self.name,self.color))
        def play(self,toil):
        print("{}正在玩{}的小玩具".format(self.name, self.color))
        ref = Reflect()
    • hasattr

      • 方法格式

        • hasattr(object,keywords)

        • 判断object对象中,是否有和keywords相匹配的方法和属性

          • 有则返回:True

          • 没有则返回:False

      • 使用举例

          • #使用hasattr判断是否有和关键字相匹配的属性和方法
            # flag = hasattr(ref,"name") #结果为True,存在name属性
            # flag = hasattr(ref,"eat") #结果为True,存在eat方法
            flag = hasattr(ref,"Color") #结果为False,不存在Color方法(大小写敏感)
            print(flag)
      • getattr:

        • 方法格式

          • getattr(object,keywords)

          • 获取object对象中,和keywords相匹配的属性或方法

            • 属性

              • 返回属性的值

            • 方法

              • 返回方法的引用

          • 如果object中没有对应属性或方法,则会报错

        • 使用举例

          • 通过关键获取对象中的属性

              • #getarry的使用----通过关键字,获取对象中对应的属性值
                #通过字符串"name",获取ref对象中,name属性的值,并保存在变量str1中
                str1 = getattr(ref,"name")
                #通过字符串"color",获取ref对象中,color属性的值,并保存在变量str2中
                str2 = getattr(ref,"color")
            • 通过关键字获取对象中的方法,并执行该方法

                • #getarry的使用----通过关键字,获取对象中对应的方法,并执行
                  #第一步:获取方法
                  f_eat = getattr(ref,"eat")
                  f_play = getattr(ref,"play")
                  #第二步:执行方法
                  f_eat() #ref对象中,eat方法没有形参
                  f_play("奥特曼") #ref对象中,play方法有形参,所以必须传入参数

          应用举例

          • 做一个小程序,它有以下的功能:用户管理、商品管理、营销管理、数据统计四个模块,用户输入相应的指令后就可以进入对应的模块。

          • 定义测试类 --- 提供四个模块入口,即方法

              • class ShopManager:
                def userManage(self):
                print("欢迎进入用户管理模块")
                def goodManage(self):
                print("欢迎进入商品管理模块")
                def market(self):
                print("欢迎进入营销管理模块")
                def statistic(self):
                        print("欢迎进入数据统计模块")
                sm = ShopManager()
            • 根据用户的输入指令,访问指定模块

              • 不使用反射的实现方式

                  • #不使用反射的实现方式
                    while True:
                    target = input("-----请输入要进入的模块:")
                    if target == "userManage":
                    sm.userManage()
                    elif target == "goodManage":
                    sm.goodManage()
                    elif target == "market":
                    sm.market()
                    elif target == "statistic":
                    sm.statistic()
                        else:   #输入其它字符,则退出程序
                    break

                • 反射的实现方式
                    • #反射的应用
                      while True:
                      target = input("-----请输入要进入的模块:")
                      if hasattr(sm,target):
                      f = getattr(sm,target) #使用映射,根据输入的字符串,选择要执行的方法
                      f()
                      else: #输入其它字符,则退出程序
                      break

                文章转载自自动化测试知识分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论