前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >day 15 装饰器

day 15 装饰器

作者头像
py3study
发布2020-01-22 22:18:34
3260
发布2020-01-22 22:18:34
举报
文章被收录于专栏:python3

装饰器(重点,难点)

开闭原则: 

           对功能的扩展开放

           对代码的修改是封闭的

在目标函数前和后插入一段新的代码.不改变原来的代码

通用装饰器写法:

# 存在的意义: 在不破坏原有函数调用的基础上,给韩式添加新的功能

        def wrapper(fn):   # fn是目标函数

            def inner(*args, **kwargs): # 聚合, 为了目标函数的传参

                ''''在目标函数之前....''''

                ret = fn(*arg, **kwargs) # 打散, 调用目标函数,ret是目标韩式的返回值

                ''''在目标函数之后....'''

                return ret    #把目标函数返回值返回.保证函数正常的结束

            return inner

       

 @wrapper   ###  func = wrapper(func)  == @wrapper

        def func():

            pass

####  func = wrapper(func)    #此时fn就是func

        func()    #此时执行的是inner

举例造人

def wrapper(fn):

    def inner():

        print('浇水')

        fn()

        print('睡一觉')

    return inner

def zaoren():

    print('捏个泥人')

    print('吹口仙气')

    print('你就出来了')

zaoren = wrapper(zaoren)

zaoren()

同一个函数被多个装饰器装饰

   @wrapper1

        @wrapper2

        @wrapper3

        def func():

            pass

       1  2  3  func 3  2  1

def wrapper1(fn):

    def inner(*args, **kwargs):

        print("1111111")

        ret = fn(*args, **kwargs)

        print("2222222")

        return ret

    return inner

def wrapper2(fn):

    def inner(*args, **kwargs):

        print("3333333")

        ret = fn(*args, **kwargs)

        print("44444444")

        return ret

    return inner

def wrapper3(fn):

    def inner(*args, **kwargs):

        print("555555")

        ret = fn(*args, **kwargs)

        print("666666")

        return ret

    return inner

# 就近原则

@wrapper1

@wrapper2

@wrapper3

def func():

    print("我是可怜的func")

func()

# 1 2 3  func 3 2 1

##1111111

3333333

555555

我是可怜的func

666666

44444444

2222222

带参数的装饰器(难受)

        def wrapper_out(参数):

            def wrapper(fn):

                def inner(*args, **kwargs): # 聚合

                    在目标函数之前

                    ret = fn(*arg, **kwargs) # 打散

                    在目标函数之后

                    return ret

                return inner

            return wrapper

        

@wrapper_out(实参)  # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖

        def func():

            pass

    eval  =>  文件操作

    装饰器

    函数

开始举例

def wrapper(fn):

    def inner(*args, **kwargs):

        print('问问金老板,行情怎么样啊')

        ret = fn(*args, **kwargs)

        print('金老板骗我,恨你')

        return ret

    return inner

def yue():

    print('走啊,约不?')

yue = wrapper(yue)

yue()

进行判断

def wrapper_out(flag): # 装饰器本身的参数

    def wrapper(fn): # 目标函数

        def inner(*args, **kwargs): # 目标函数执行需要的参数

            if flag == True:

                print("问问金老板. 行情怎么样啊")

                ret = fn(*args, **kwargs) # 在执行目标函数之前

                print("金老板骗我. 恨你")

                return ret

            else:

                ret = fn(*args, **kwargs)  # 在执行目标函数之前

                return ret

        return inner

    return wrapper

# 语法糖 @装饰器

@wrapper_out(True) # 先执行wrapper_out(True) 返回一个装饰器   再和@拼接  @装饰器

def yue(): # 被 wrapper装饰

    print("走啊. 约不?")

yue()

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/04/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档