python7:装饰器

07-11 1074阅读

目录

  • 1.调用外部程序
    • os.system-阻塞式调用
    • subprocess-python中的模块
    • 2.装饰器前戏
      • 作用域
        • (1)全局和局部-就近原则
        • (2)嵌套作用域
        • (3)内置作用域、变量
        • 高阶函数:函数是最高级的对象
          • (1)函数名可以被赋值给其他对象
          • (2)函数名当作参数传递
          • (3)函数名可以作为返回值
          • 闭包
          • 3.装饰器高阶
            • 测试任务
            • 装饰器概念

              1.调用外部程序

              os.system-阻塞式调用

              import os
              #打开操作系统,可以输入命令
              os.system("ipconfig")
              retCode=os.system("mspaint")
              print("retCode",retCode)
              print("after")
              

              画板打开并关闭后,才执行下一步打印操作

              python7:装饰器

              subprocess-python中的模块

              subprocess.check_output:以字节形式返回,不能直接打印到控制台

              subprocess.Popen:非阻塞式的,可以直接打印到控制台

              import subprocess
              #执行命令,将结果以字节形式返回,bytes
              output_bytes=subprocess.check_output("ipconfig")
              print(output_bytes.decode("gbk"))
              print("=======after=========")#解码转为人能看懂的语言,mac写utf-8,windows写gbk
              subprocess.Popen("ipconfig")
              print("=========after================")
              

              python7:装饰器

              2.装饰器前戏

              作用域

              #解决Non-utf-8问题,在python代码最前面放这几行代码

              Python file uses the following encoding: utf-8
              

              (1)全局和局部-就近原则

              先在自己这一层找

              当局部变量和全局变量重名时:

              • 在局部作用域使用该变量,则使用局部变量
              • 在全局使用时,使用的是全局。
                # This Python file uses the following encoding: utf-8
                b = 99#全局变量
                def foo():
                    a=100#局部变量
                    print(a)
                    print(b)#局部作用域使用全局变量,可以
                foo()
                # print(a)#在全局使用局部变量,报错
                print(b)# 全局作用域使用全局变量,可以
                

                python7:装饰器

                (2)嵌套作用域

                # This Python file uses the following encoding: utf-8
                b = 99#全局变量
                def foo():
                    a=100#局部变量
                    print(a)
                    print(b)#局部作用域使用全局变量,可以
                    def bar():
                        c=21#嵌套局部变量
                        print("嵌套==",a,b,c)#嵌套作用域引用局部变量和全局变量
                    bar()
                  //  print(c)#局部引用内置嵌套局部变量,报错
                foo()
                # print(a)#在全局使用局部变量,报错
                print(b)# 全局作用域使用全局变量,可以
                

                python7:装饰器

                (3)内置作用域、变量

                系统内固定模块里预先定义好的变量:

                name

                os模块里的变量

                python7:装饰器

                高阶函数:函数是最高级的对象

                (1)函数名可以被赋值给其他对象

                def foo():
                    print("我是一个函数对象")
                a=foo#将函数对象赋给变量,a就具有了函数foo的特征
                print(a)
                b=foo()#调用函数,并将函数foo的返回值赋给变量b,b就等于foo的返回值
                print(b)
                

                python7:装饰器

                (2)函数名当作参数传递

                def foo1(func):
                    func()
                def bar():
                    print("123")
                foo1(bar)
                

                python7:装饰器

                (3)函数名可以作为返回值

                #函数名可以作为返回值
                def foo():
                    def bar():
                        print("过年啦")
                    return bar
                a=foo()
                a()
                

                python7:装饰器

                闭包

                在一个内部函数里边,对在外部作用域(但不是全局作用域)的变量进行引用,那么这个内部函数就被认为是闭包

                python7:装饰器

                #闭包
                def outer():
                    x=10
                    def inner():
                        print(x)
                    return inner
                a=outer()
                a()
                

                3.装饰器高阶

                测试任务

                装饰器概念

                为已经存在的对象添加额外的功能

                python7:装饰器

                python7:装饰器

                import time
                #原本逻辑
                def foo():
                    print("执行了一些测试逻辑")
                    time.sleep(1)
                #新增计时逻辑
                def show_time(func):
                    def inner():
                        begin_time=time.time()
                        func()
                        end_time=time.time()
                        print("用例执行时间==",end_time-begin_time)
                    return inner
                foo=show_time(foo)
                foo()
                

                python7:装饰器

                foo被装饰函数,show_time是装饰器(装饰函数),python提供了语法糖,在被装饰函数上@装饰器,这样就不用赋值了每次

                import time
                #新增计时逻辑
                def show_time(func):
                    def inner():
                        begin_time=time.time()
                        func()
                        end_time=time.time()
                        print("用例执行时间==",end_time-begin_time)
                    return inner
                #原本逻辑
                @show_time
                def foo():
                    print("执行了一些测试逻辑")
                    time.sleep(1)
                # 省去了赋值的步骤,在外部看来相当于直接调用原函数
                foo()
                
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]