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

@outer
def f1():
    print("F1")

@outer
def f2():
    print("F2")

@outer
def f100():
    print("F100")

f1()
f2()

并增加after:
def outer(func):
    def inner():
        print('log')
        ret = func()
        print("after")
        return ret
    return inner

@outer
def f1():
    print("F1")

@outer
def f2():
    print("F2")

@outer
def f100():
    print("F100")

f1()
f2()

装饰器流程剖析:

声明:
【函数的整体是可以被其他函数当做参数所调用,传递的】
def f1():
    ')

def f2(xxx):
    xxx()
f2(f1)

结果:123

流程剖析,例一:
def outer(func):
    print(123,func)

@outer
def 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)

@outer
def 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

@outerdef 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

@outerdef 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

@outerdef f1(arg):    print(arg)    return "砍你"

ret = f1('fafafa')print("返回值:",ret)

@outerdef 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):
    ':
        LOGIN_USER['is_login'] = True
        LOGIN_USER['current_user'] = user
        manger()

def main():
    while True:
        inp = input("1.manger 2.login")
        ':
            manger()
        ':
            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

@outer
def changepwd():
    print("welcom to %s login"%LOGIN_USER['current_user'])

@outer
def manger():
    print("welcom to %s login"%LOGIN_USER['current_user'])

def login(user,pwd):
    ':
        LOGIN_USER['is_login'] = True
        LOGIN_USER['current_user'] = user
        manger()

def main():
    while True:
        inp = input("1.manger 2.login")
        ':
            manger()
        ':
            username = input("username:")
            passwd = input("password:")
            login(username,passwd)
main()

装饰器-之执行流程图:

示例2:

示例3:

python笔记 - day4-之装饰器的更多相关文章

  1. guxh的python笔记三:装饰器

    1,函数作用域 这种情况可以顺利执行: total = 0 def run(): print(total) 这种情况会报错: total = 0 def run(): print(total) tot ...

  2. python笔记5:装饰器、内置函数、json

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...

  3. python笔记-4(装饰器、生成器、迭代器)

    一.熟练掌握装饰器的原理 (在装饰器学习的过程中,查了看了很多资料,个人感觉走了很多的弯路,这个笔记,分享我的理解,希望能帮助到一些人.本文对装饰器的描述,侧重点是条理与逻辑思路,想通过从无到有的方式 ...

  4. python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式

    闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...

  5. python 3.x 的装饰器笔记

    今天学到了python的装饰器,感觉这个东西还是稍微有些复杂,所以记录下来,方便以后的查找.虽然标题是python 3.x的装饰器,但是我也没有怎么用过python 2.x,感觉上应该是和python ...

  6. python函数与方法装饰器

    之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...

  7. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  8. python设计模式之内置装饰器使用(四)

    前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...

  9. python 中多个装饰器的执行顺序

    python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...

  10. Python函数编程——闭包和装饰器

    Python函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个 ...

随机推荐

  1. How to Disable Strict SQL Mode in MySQL 5.7

    If your app was written for older versions of MySQL and is not compatible with strict SQL mode in My ...

  2. 垂直居中display:table;

    父级元素 display:table: 子元素 display:table-cell:vertical-align:middle:

  3. linux常见目录的作用

    根目录下的bin 和sbin,usr目录下的bin和sbin四个都是保存系统命令.bin下的普通用户都可以使用,sbin下只有超级用户root可以使用 pro和syc不能直接操作,是内存的过载点 / ...

  4. AndroidJNI 调用JAVA(转)

    转自:http://www.cnblogs.com/likwo/archive/2012/05/21/2512400.html   1. JNIEnv对象    对于本地函数    JNIEXPORT ...

  5. 利用procdump+Mimikatz 绕过杀软获取Windows明文密码(转)

    Mimikatz现在已经内置在Metasploit’s meterpreter里面,我们可以通过meterpreter下载.但是你如果觉得还要考虑杀毒软件,绑定payload之类的东西太过复杂,我们可 ...

  6. WKWebView使用过程中的那些坑

    问题产生背景: 新开发的页面中有一部分的界面是需要展示后端接口返回的HTML代码,包括文字和图片.所以就自然而然的要使用iOS原生的WebKit. 鉴于Xcode 8发布以后,编译器支持的最低版本(D ...

  7. 微软将彻底改变Windows发布方式

    看到网上的新闻信息: 微软上任 CEO 史蒂夫·鲍尔默在职最后一段时间引入了更快的产品公布周期.不再向从前那样,每隔几年公布一次重大产品升级,而是功能一旦开发完成就会推送升级. 显然,现任 CEO 纳 ...

  8. Vim编辑器与Shell命令脚本

    章节简述: 本章节将教给您如何使用Vim编辑器来编写文档.配置主机名称.网卡参数以及yum仓库 ,熟练使用各个模式和命令快捷键. 我们可以通过Vim编辑器将Linux命令放入合适的逻辑测试语句(if. ...

  9. ElasticSearch 学习记录之集群分片内部原理

    分片内部原理 分片是如何工作的 为什么ES搜索是近实时性的 为什么CRUD 操作也是实时性 ES 是怎么保证更新被持久化时断电也不丢失数据 为什么删除文档不会立即释放空间 refresh, flush ...

  10. mycat全局自增

    指定自增类型 [root@node002 conf]# vi   /usr/local/mycat/conf/server.xml 每个参数代表的含义: 0:本地文件自增方式. 1:使用mysql自增 ...