• python 装饰器


    上节课复习
    1,函数的嵌套
    函数的嵌套调用
    def foo():
    bar()
    函数的嵌套定义
    def f1():
    def f2():
    pass
    print(f2)
    f2()
    2,名称空间与作用域
    名称空间:用来存放名字与绑定关系的地方,x=【1,2,3,4,5】
    内置名称空间;
    1,存放python解释器自带的名字
    2,解释器启动时生效,关闭时失效
    全局名称空间
    1,存放文件级别的名字
    2,执行python文件时失效,文件执行完失效
    局部名称空间
    1,存放函数定义的名字
    2,函数调用时失效,函数结束时失效
    加载顺序:内置》—全局》局部
    名字查找:局部》全局 》 内置

    作用域:
    全局范围:
    内置加全局
    全局有效,全局存活
    局部范围:
    局部
    局部有效,局部存活

    作用域关系是在函数定义阶段就规定死了,与调用位置无关
    也就是说,无论函数在哪儿调用,都必须回到当初定义函数时的位置找作用域关系

    为函数体传值的俩种方式
    方式1 :直接为该函数添加对应的值
    def inner(name):
    print(name)
    inner('egon')

    方式2
    def outter(name)
    #name=egon
    def nner():
    print(name)
    return inneri

    f=outter(’gon‘)
    f()


    3,函数对象,1可以被引用 2,可以当参数传给另外一个值,3,当函数返回值

    4,闭包函数
    定义在函数内部的函数,并且该函数包含对外部函数作用域(对全局作用域名字的引用不算闭包)名字的引用,该函数称为闭包函数

    def outter():
    x=1
    def inner():
    print(x)
    return inner
    func=outter()
    func()


    新知识
    1 开放封闭原则
    软件一旦上线后,就应该遵循开放封闭原则,对修改源代码是封闭的,对功能的扩展是开放的
    也就是我们必须找到一种解决方案:
    能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能
    总结:1,不修改源代码 2,不修改调用方式
    目的: 在遵循1和2的基础上扩展功能

    2,什么装饰器?
    器指工具,装饰指为被装饰对象添加新功能,装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能

    #无参装饰器
    # import time
    # def index():
    # start_time=time.time()
    # time.sleep(3)
    # print('welcome to index page')
    # stop_time=time.time()
    # print('run time is %' %(stop_time-start_time))
    # index()
    #
    # #修改1
    # import time
    # def index():
    # time.sleep(3)
    # print('welcome to index page')
    # def home(name):
    # time.sleep(5)
    # print('welcome%s to home page ' %name)
    #
    # start_time=time.time()
    # index()
    # stop_time=time.time()
    # print('run time is%s %' %(stop_time-start_time))
    #
    # start_time=time.time()
    # home()
    # stop_time=time.time()
    # print('run time is% %' %(stop_time-start_time) )

    #修改2
    # import time
    # def index():
    # time.sleep(3)
    # print('welcome to index page')
    #
    # def home(name):
    # time.sleep(5)
    # print('welcome %s to home page' %name)
    #
    # def wrapper(func):
    # start_time = time.time()
    # func()
    # stop_time = time.time()
    # print('run time is% %' %(stop_time-start_time))
    #
    # wrapper(index)

    #修改4
    # import time
    #
    #
    # def index():
    # time.sleep(3)
    # print('welcome to index page')
    #
    # def outter(func):
    # #func=index()
    # def wrapper():
    # start_time = time.time()
    # func()
    # stop_time = time.time()
    # print(stop_time - start_time)
    # return wrapper
    #
    #
    # index=outter(index)
    # index()

    #无参装饰器升级版
    import time


    def index():
    time.sleep(3)
    print('welcome to index page')

    def home(name):
    time.sleep(2)
    print('welcome %s to home page' %name)


    def outter(func):
    #func=index()
    def wrapper(*args,**kwargs):
    start_time = time.time()
    res=func(*args,**kwargs)
    stop_time = time.time()
    print(stop_time - start_time)
    return res
    return wrapper


    index=outter(index)
    index()
    home=outter(home)
    home('alex')

    res=index()
    print(res)

    #无参装饰器模板
    def outter(func):
    def inner(*args,**kwargs):
    res=func(*args,**kwargs)
    return res
    return inner()

    #装饰器语法
    import time
    def outter(func):
    #func=index()
    def wrapper(*args,**kwargs):
    start_time = time.time()
    res=func(*args,**kwargs)
    stop_time = time.time()
    print(stop_time - start_time)
    return res
    return wrapper

    @outter
    def index():
    time.sleep(3)
    print('welcome to index page')
    @outter
    def home(name):
    time.sleep(2)
    print('welcome %s to home page' %name)


    def outter(func):
    #func=index()
    def wrapper(*args,**kwargs):
    start_time = time.time()
    res=func(*args,**kwargs)
    stop_time = time.time()
    print(stop_time - start_time)
    return res
    return wrapper


    index()#index=outter(index)
    home('alex')#home=outter(home)


    res=index()
    print(res)


    #装饰器认证实现
    db_path='db.txt'
    import time
    currnt_user={
    'username':None,
    }

    def outter(func):
    def inner(*args,**kwargs):
    if currnt_user['username']:
    print('已经登陆过了')
    res=func(*args,**kwargs)
    return res

    uname=input('输入用户名: ').strip()
    pwd=input('输入密码:').strip()
    if uname=='egon' and pwd=='123':#写死了 应该用文件
    print('登陆成功')
    currnt_user['username']=uname
    res=func(*args,**kwargs)
    return res

    else:
    print('用户名或者密码错误')
    return inner()
    @outter
    def index():
    time.sleep(1)
    print('welcome to indexpage')
    return 122
    @outter
    def home(name):
    time.sleep(2)
    print('welcom %s to home oage' %name)

    index()
    home('egon')

  • 相关阅读:
    delphi SysErrorMessage 函数和系统错误信息表 good
    Delphi中ShellExecute使用详解(详细解释10种显示状态)
    几个获取Windows系统信息的Delphi程序
    判断操作系统多久没有任何操作
    MVC4+WebApi+Redis Session共享练习(下)
    MVC4+WebApi+Redis Session共享练习(上)
    EntityFramework使用总结(与MVC4.0实现CURD操作)
    MVC3.0+knockout.js+Ajax 实现简单的增删改查
    基于Redis缓存的Session共享(附源码)
    Redis缓存服务搭建及实现数据读写
  • 原文地址:https://www.cnblogs.com/maojiang/p/8672073.html
Copyright © 2020-2023  润新知