Python闭包和装饰器

闭包:内部函数的参数调用外部函数的参数就是一个闭包

def A():

    a = 1

    def B():

        print(a)

    return B #

a = A()

a()

这样的一个函数就构成了闭包函数

例子说明去理解闭包和装饰器之间的关系

from functools import wraps

def wrapper(f):

    @wraps(f)

    def inner(*args, **kwargs):

        ret = f(*args, **kwargs)

        return ret

    return inner

@wrapper  # func = wrapper(func) wrapper函数

def func(a, b, c, d=1234):

    print(a, b, c, d)

    return "Hello World"

-------------------------------------结果----------------------------------------

print(func.__name__)

if func.__doc__:

print("True")

--------------------------------------------------------------------------------

*args 是接受任意数据类型

**kwargs是接受位置参数 比如a=1 ,b =4

@wrapper其实就是去执行wrapper函数把func当成参数去执行,func进入wrapper之后,本质上就是执行了inner函数。

-------------------------------------------------------------------------------------

加深小练习:

编写装饰器,为多个函数加上认证功能(用户的账号密码来源于文件)要求登录成功一次 后续的函数都无需输入用户名和密码

FLAG = False

def login(f):

    def inner(*args, **kwargs):

    global FLAG

    if FLAG:

        ret = f(*args, **kwargs)

        return ret

    else:

        username = input("username:")

        password = input("password:")

        if username == 'admin' and password == '1234':

            FLAG = True

            ret = f(*args, **kwargs)

            return ret

        else:

            print("错误!")

    return inner


@login

def shoplist_add():

    print("add")


@login

def shoplist_delete():

    print("delete")

-----------------------------------------------------------------------------------

# 编写装饰器 为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件

def log(func):

    def inner(*args, **kwargs):

        with open('log', 'a', encoding='utf-8') as f:

            f.write(func.__name__ + '\n')

           ret = func(*args, **kwargs)

            return ret

        return inner


@log  # shoplist_add = log(shoplist_add)

def shoplist_add():

    print("add")

@log

def shoplist_delete():

    print("delete")


shoplist_delete()

shoplist_add()

-------------------------------------------------------------------------------------

#.1编写下载网页内容的函数 要求功能是: 用户传入一个url 函数返回下载页面的结果2.为题目1编写装饰器 实现缓存网页中欧内容的功能

具体 实现下载的页面存放与文件中 如果文件内有值(文件大小不为0)就优先从文件中读取网页内容 否则就去下载'''

import os

from urllib.request import urlopen

def cache(func):

    def inner(*args, **kwargs):

        if os.path.getsize('web_Cache'):

            with open('web_Cache','rb')as f:

                return f.read()

        ret = func(*args, **kwargs)

        with open('web_Cache','wb') as f:

            f.write(b'*********' + ret)

        return ret

    return inner

@cache # get = cache(get)

def get(url):#inner

    code = urlopen(url).read()

return code

# {'网址':"文件名"}

url ='https://baike.baidu.com/item/%E5%A4%A7%E4%BD%AC/33459'

ret = get(url)

print(ret)

ret = get(url)

print(ret)


python装饰器进阶代码:

import time

Flag =True

def contrl_flag(flag):

    def timer(func):

        def inner(*args, **kwargs):

            if flag:

                start = time.time()

                ret = func(*args, **kwargs)

                end = time.time()

                print(end - start)

                return ret

           else:

                ret = func(*args, **kwargs)

                return ret

        return inner

    return timer


@contrl_flag(Flag)

def test1():# @timer = timer(test1)

    time.sleep(0.1)

print("test1")


@contrl_flag(Flag)

def test2():

    time.sleep(0.1)

    print("test2")


test1()

test2()

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本节课纲: 魔法方法之_call_ 闭包 装饰器 装饰器实例 一、魔法方法之_call_ 在Python中,函数其...
    郭_扬阅读 3,150评论 0 0
  • python万物皆对象! 闭包 闭包:两个函数的嵌套,外部函数返回内部函数的引用,外部函数一定有参数 def 外部...
    风舞柏杨阅读 4,172评论 2 0
  • 1. 闭包 概念:在函数嵌套的前提下,内层函数引用了外层函数的变量(包括参数),外层函数又把内层函数当做返回值进行...
    马本不想再等了阅读 2,586评论 1 7
  • 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返...
    胡一巴阅读 3,153评论 0 0
  • 装饰器函数 楔子 作为一个会写函数的python开发,我们从今天开始要去公司上班了。写了一个函数,就交给其他开发用...
    go以恒阅读 1,877评论 0 0

友情链接更多精彩内容