Back
Featured image of post python3 | function & decorator 1

python3 | function & decorator 1

装饰器给我写得云里雾里的

课程小总结

装饰器比较麻烦,可能是写少了,总觉得绕来绕去的。

函数的嵌套

函数可以定义在全局、也可以定义另外一个函数中(函数的嵌套)

函数嵌套在多人开发的时候,可以避免全局命名冲突,特别当一个函数功能特别大,拆分成几个小函数也是比较好的。

  • 优先在自己的作用域找,自己没有就去上级作用域。
  • 在作用域中寻找值时,要确保此次此刻值是什么。
  • 分析函数的执行,并确定函数作用域链。(函数嵌套)

闭包 - closure

闭包,简而言之就是将数据封装在一个包(区域)中,使用时再去里面取。(本质上 闭包是基于函数嵌套搞出来一个中特殊嵌套)

  • 封装数据防止污染全局。
  • 封装数据封到一个包里,使用时在取

装饰器 - decorator

  • 实现原理:基于@语法和函数闭包,将原函数封装在闭包中,然后将函数赋值为一个新的函数(内层函数),执行函数时再在内层函数中执行闭包中的原函数。

  • 实现效果:可以在不改变原函数内部代码 和 调用方式的前提下,实现在函数执行和执行扩展功能。

  • 适用场景:多个函数系统统一在 执行前后自定义一些功能。

  • 装饰器示例

    import functools
     
    def auth(func):
        @functools.wraps(func)
        def inner(*args, **kwargs):
            """巴巴里吧"""
            res = func(*args, **kwargs)  # 执行原函数
            return res
     
    

作业

作业1

请为以下函数编写一个装饰器,添加上装饰器后可以实现: 检查文件所在路径(文件件)是否存在,如果不存在自动创建文件夹(保证写入文件不报错)。

import os
import functools

def judge_path(func):
    @functools.wraps(func)
    def inner(path): # 这里相当于重命名了要处理的函数
        folder_path = os.path.dirname(path)
        if not os.path.exists(folder_path): # 如果给的路径不存在
            os.makedirs(folder_path)
        res = func(path)	# 执行文件的打开和写入关闭
        return res
    return inner

@judge_path	# 这个@效果等于让下面的def变身为→judge_path(write_user_info)
def write_user_info(path):
    file_obj = open(path, mode='w', encoding='utf-8')
    file_obj.write("hello")
    file_obj.close()

write_user_info('files/text/kkk.txt')

作业2

请为以下所有函数编写一个装饰器,添加上装饰器后可以实现:将被装饰的函数执行5次,讲每次执行函数的结果按照顺序放到列表中,最终返回列表。

import functools
import random

def re_5_times(func):
    @functools.wraps(func)
    def inner (*args,**kwargs):
        list = []
        for i in range(0,5):
            res = func(*args, **kwargs)
            list.append(res)
        return list
    return inner

@re_5_times
def func():
    return random.randint(1,4)

result = func() # 内部自动执行5次,并将每次执行的结果追加到列表最终返回给result
print(result)

扩展

ThreadPoolExecutor资料

decorator装饰器参考

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy