装饰器

装饰器

主要内容:
  1.函数名的运用,第一类对象

  2.闭包

  3.装饰器

  4.通用装饰器的回顾

  5.函数的有用信息

  6.带参数的装饰器

  7.多个装饰器同时装饰一个函数

一.函数名的运用

函数名是一个变量,但是一个特殊的变量,与括号配合可以执行函数的变量

  1.函数的内存地址

def fun():
    print('呵呵')
print(fun) # 返回这个函数的内存地址

  2.函数名可以赋值给其他的变量

def fun():
    print('呵呵')
print(fun)
a = fun
a()

  3.函数名可以当作容器类元素

复制代码
def func1():
    print('呵呵')
def func2():
    print('哈哈')
def func3():
    print('拉拉')
def func4():
    print('可可')
def func5():
    print('哦哦')
lst = [func1,func2,func3,func4,func5]
for i in lst:
    i()
复制代码

  4.函数名可当做函数的参数

复制代码
def func():
    print('吃了么')
def func2(fn):
    print('我是func2')
    fn()
    print('我是func2')
func2(func)
复制代码

  5.函数名可以作为函数的返回值

复制代码
def func_1():
    print('这里是函数1')
    def func_2():
        print('这是函数2')
    print('这是函数1')
    return func_2
fn = func_1()
fn()
复制代码

二.闭包

  什么是闭包?闭包就好是内层函数,对外层函数(非全局)的变量的引用,叫闭包

def func1():
    name = 'alex'
    def func2():
        print(name)
    func2()
func1()

  我们可以用_closure_来检测函数是否是闭包,如果是闭包就返回:cell,不是闭包就返回None

复制代码
def func1():
    name = 'alex'
    def func2():
        print(name)
    func2()
    print(func2.__closure__)
func1()
复制代码

  如何在函数外边调用内部函数

复制代码
def outer():
    name= "alex"
    def inner():
        print(name)
    return inner
fn = outer()
fn() # 访问内部函数
复制代码

  多层嵌套如何办

复制代码
def func1():
    name = 'alex'
    def func2():
        def func3():
            def func4():
                print(name)
            return func4
        return func3
    return func2
func1()()()()
复制代码

  闭包的作用就是一个变量能够常驻内存,供后面的程序使用

三.装饰器初始

  软件设计的原则:开闭原则,又被称为开放封闭原则,你的代码对功能的扩展是开放的,你的程序对修改源代码是封闭的,这样的软件设计思路可以更好的维护和开发

  开放:对功能扩展开放

  封闭:对修改代码封闭

复制代码
def create_people():
    print('女娲很厉害,还会捏人呢')
def warter(fn):
    def inner():
        print('先取水')
        fn()
        print('最后在上烤炉')
    return inner
create_people= warter(create_people)
create_people() # 这个create_people其实相当于inner
复制代码

  我们使用warter函数把create_people给包装一下,在不修改create_people的前提下,完成了对create_people的函数的功能添加

  语法糖:@装饰器

  1.最基本的

复制代码
def wen_jin(fn):
    def inner():
        print('执行函数之前')
        fn()
        print('执行之后')
    return inner
@wen_jin # 这个就相当于yue = wen_jin(yue) #也就是个inner
def yue():
    print('大家好')
yue()
复制代码

  2.中级

复制代码
# 最基本的参数传递
def wen_jin(fn):
    def inner(name):
        print('函数执行之前')
        fn(name)
        print('函数执行之后')
    return inner
@wen_jin
def yue(name):
    print('呵呵了',name)
yue('熬啊')
复制代码

 

  3.最终(也是最基本的装饰器格式)

复制代码
# 带参数了,还需要返回值
def wrapper(func):
    def inner(*args,**kwargs):#聚参
        print('函数之前要执行的内容')
        ret = func(*args,*kwargs) # 解参
        print('函数之后要执行的内容')
        return ret    #返回这个函数的返回值
    return inner
@wrapper
def target_func(a,b,c,d):
    print('函数执行中%s'%a,b,c,d)
    return

target_func(1,3,6,2)
复制代码

4.函数的有用信息
   1.给函数添加注释
   在函数的第一行加上3个三引号
   2.如何获取函数的相关信息
   函数名.__name__可以查看函数的名字
   函数名.__doc__可以查看函数文档的注释
  

5.修改函数的名称
   from functools import wraps 引入模块
   @wraps(函数名)
   def inner()
  

6.装饰器传参
  就是在最外层加一层,里面可以添加一个变量
  

7.多个装饰器装饰同一个函数
  顺序是:321函数123        {   [   ( 函数 )   ]   }

原文地址:https://www.cnblogs.com/123zzy/p/9185138.html