博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python笔记 - day4-之装饰器
阅读量:4563 次
发布时间:2019-06-08

本文共 4002 字,大约阅读时间需要 13 分钟。

               python笔记 - day4-之装饰器                    

需求:给f1~f100增加个log:def outer():                #定义增加的log    print("log")  def f1():    outer()                   #分别调用函数    print("F1")def f2():    outer()                   #分别调用函数    print("F2")def f100():    outer()                   #分别调用函数    print("F100")f1()f2()f100()使用装饰器,增加log:def outer(func):    def inner():        print("log")        return func()    return inner@outerdef f1():    print("F1")@outerdef f2():    print("F2")@outerdef f100():    print("F100")f1()f2()并增加after:def outer(func):    def inner():        print('log')        ret = func()        print("after")        return ret    return inner@outerdef f1():    print("F1")@outerdef f2():    print("F2")@outerdef f100():    print("F100")f1()f2()

装饰器流程剖析:

声明:【函数的整体是可以被其他函数当做参数所调用,传递的】def f1():    print('123')def f2(xxx):    xxx()f2(f1)结果:123流程剖析,例一:def outer(func):    print(123,func)@outerdef f1():    print('F1')Readme:1.执行程序后,会把123,重新赋值给f1,并且把老的,加载到内存的f1“print('F1')”,当做参数,当做参数,传给func;2.print(123,func),func,就是老的f1,通过传给func打印出来; 流程剖析,例二:def outer(func):    def inner():        print('before')  #赋值给下面的f1        func()             #调用执行老的f1        print('after')    return inner  #把结果返回给下面f1,并赋值给下面的f1;(注意:这里加括号,就是执行函数;不加括号,就是把inner函数体所有内容返回给f1,并重新赋值给f1)@outerdef f1():    print('F1')f1() Readme:* 定义了两个函数,没有调用函数,不会执行;功能一:加上@outer,(@ + 函数名)后实现的效果:    自动执行outer函数,并且将其下面的函数名f1当作参数传递;功能二:    将outer函数的返回值,重新赋值给f1; 装饰器,返回值:
def outer(func): def inner(): print('before') r = func() #为什么不把这里直接写成return func(),因为这里这样写的话就会直接返回结果,下面的代码就不会执行了 print('after') return r return inner @outer def f1(): print('F1') return "砍你" ret = f1() print("返回值:",ret)
装饰器,参数:
def outer(func): def inner(arg): #这里加参数arg是因为执行程序后会把inner重新赋值给f1, # 老f1有参数,所以也必须给inner加上参数; print("before") r = func(arg) #这里是执行的是老f1,老f1需要传入一个参数, #r = func(123) #所以在这里给他传入参数; print("after") return r return inner @outer def f1(arg): print(arg) return "砍你" res = f1('fffff') print(res)
装饰器,接收多个参数:
def outer(func): def inner(*args,**kwargs):    #想要接收多个参数,改这里 print('before') r = func(*args,**kwargs) #想要接收多个参数,改这里 print('after') return r return inner @outer def f1(arg): print(arg) return "砍你" ret = f1('fafafa') print("返回值:",ret) @outer def f2(arg1,arg2): print("F2") f2('bbbbb','ccccc')
 
 

 装饰器之-应用示例

验证用户登陆,不使用装饰器:#!/usr/bin/python env#_*_coding:utf-8 _*_LOGIN_USER = {
"is_login":False}def changepwd(): if LOGIN_USER['is_login']: print("welcom to %s login"%LOGIN_USER['current_user']) else: print("Please login.")def manger(): if LOGIN_USER['is_login']: print("welcom to %s login"%LOGIN_USER['current_user']) else: print("Please login.")def login(user,pwd): if user == 'alex' and pwd == '123': LOGIN_USER['is_login'] = True LOGIN_USER['current_user'] = user manger()def main(): while True: inp = input("1.manger 2.login") if inp == '1': manger() elif inp == '2': username = input("username:") passwd = input("password:") login(username,passwd)main()验证用户登陆,使用装饰器:#!/usr/bin/python env#_*_coding:utf-8 _*_LOGIN_USER = {
"is_login":False}def outer(func): def inner(*args,**kwargs): if LOGIN_USER['is_login']: #使用装饰器后,只有这个条件成立了,才会执行下面的函数 r = func()         #只有上面条件成立了,才会执行func()这个函数        return r else: print("Please login") return inner@outerdef changepwd(): print("welcom to %s login"%LOGIN_USER['current_user'])@outerdef manger(): print("welcom to %s login"%LOGIN_USER['current_user'])def login(user,pwd): if user == 'alex' and pwd == '123': LOGIN_USER['is_login'] = True LOGIN_USER['current_user'] = user manger()def main(): while True: inp = input("1.manger 2.login") if inp == '1': manger() elif inp == '2': username = input("username:") passwd = input("password:") login(username,passwd)main()

装饰器-之执行流程图:

示例2:

示例3:

转载于:https://www.cnblogs.com/tangshengwei/p/5671124.html

你可能感兴趣的文章
编程中的那些容易迷糊的小知识
查看>>
Sizzle前奏
查看>>
Paint Chain HDU - 3980(sg)
查看>>
Chales常用操作
查看>>
C++ 运算符重载<<
查看>>
windows镜像
查看>>
Flask 模板语法
查看>>
ZOJ FatMouse' Trade 贪心
查看>>
音乐播放器
查看>>
SQL COOKBOOK (Ch.1-10)
查看>>
创建数组
查看>>
dict使用
查看>>
[转] 移动平台Html5的viewport使用经验
查看>>
ASP.NET MVC的帮助类HtmlHelper和UrlHelper
查看>>
《Python数据科学手册》第五章机器学习的笔记
查看>>
ubuntu16.04 配置爬虫环境
查看>>
Centos7,PHP7安装swoole
查看>>
02_ListActive中响应事件 并LogCat输出
查看>>
doubleclick adx note
查看>>
Celery框架
查看>>