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.x 的装饰器笔记

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

  5. python函数与方法装饰器

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

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

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

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

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

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

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

  9. python 学习笔记7(装饰器)

    闭包(closure)是函数式编程的重要的语法结构. 定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). def outer ...

  10. Python 学习笔记9(装饰器,decorator)

    31 装饰器 装饰器可以对一个函数.方法或者类进行加工,是一种高级的python语法. 装饰函数 接收一个可调用对象作为输入参数,并返回一个新的可调用对象. 把函数传递给装饰器,然后增加新的功能,返回 ...

随机推荐

  1. Gnome_Terminal

    快捷键 ctrl shift m 我自定义的快捷键,可以给终端命名 ctrl shift t 新建标签页,并且目录为当前目录 ctrl shift pageup 标签页往前移 ctrl shift p ...

  2. Redis服务器的启动过程分析

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/127.html?1455808771 本文将通过分析代码来介绍Redis的 ...

  3. SQL语句汇总(一)——数据库与表的操作以及创建约束

    首先,非常感谢大家对上篇博文的支持,真是让本菜受宠若惊,同时对拖了这么久才出了此篇表示抱歉. 前言:此文旨在汇总从建立数据库到联接查询等绝大部分SQL语句.SQL语句虽不能说很多,但稍有时间不写就容易 ...

  4. HDU 5639 Deletion 二分+网络流

    题意:bc round 74 div1 分析: 考虑删掉的边的形态, 就是我们经常见到的环套树这种结构, 参考平时这种图给出的方法, 如果一个图的每个点的出边只有一条, 那么一定会构成环套树这种结构. ...

  5. 安装 nodejs

    接下来使用npm命令安装express和socket.io 没有的话 用yum 安装一下 12 npm install --save expressnpm install --save socket. ...

  6. sphinx安装

    相关命令及步骤    创建主索引:        /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all  ...

  7. &lt;转&gt;LOG日志级别

    Level Description Example emerg Emergencies - system is unusable 紧急 - 系统无法使用 Child cannot open lock ...

  8. Log4j 日志记录

    关于Log4j的简单示例 <!--手动配置log4j.properties文件内容:-->1 #level:debug/info/warn/error log4j.rootLogger=O ...

  9. window.location.href

    WEB设置首页 <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-f ...

  10. 《剑指offer》第二十五题(合并两个排序的链表)

    // 面试题25:合并两个排序的链表 // 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 // 照递增排序的.例如输入图3.11中的链表1和链表2,则合并之后的升序链表如链 ...