引用、闭包、装饰器

引用

	# 引用
def demo1():
    print('这是demo1里面的。。。')
    
	# 引用函数
demo2 = demo1 # 代表函数内部代码的引用,demo2此时也指向demo1里面的内部代码
def test():
    print('这是在test里面的。。。')
demo1 = test  # 重新指向的操作

	# 调用函数
demo1()  # 这是在test里面的。。。
demo2()  # 这是在demo1里面的。。。
test()   # 这是在test里面的。。。

在这里插入图片描述

闭包

两个函数的嵌套,内部函数使用到了外部函数的数据(变量),这个现象就可以称之为 产生闭包

装饰器的作用

由闭包衍生而来:函数间的嵌套,内部的函数用到了外部函数的数据(变量,或者说 东西)

作用:装饰器就是可以在不修改原函数内部代码的情况下,对其增加功能(增加代码)

函数内部去添加代码,增加功能,尽量不要去修改原函数内部的代码,用装饰器就可以避免这个缺点

def a(c): # 外部函数
    def b(): # 内部函数
        print('中华人民共和国的:', end='')
        c()   # c 函数调用
    return b
@a    # 要对其增加功能的函数,我们就称之为要被装饰的函数,对其增加功能的操作就称之为装饰
def demo1():
    print('湖南省')
@a
def demo2():
    print('湖北省')
@a
def demo3():
    print('台湾省')

demo1()
demo2()
demo3()

在这里插入图片描述
一样的效果(理解篇):

def a(c): # 外部函数
    def b(): # 内部函数
        print('中华人民共和国的:', end='')
        c()   # c 函数调用
    return b

# 要对其增加功能的函数,我们就称之为要被装饰的函数,对其增加功能的操作就称之为装饰
# @a # demo1 = a(demo1)
def demo1():
    print('湖南省')
# @a # demo2 = a(demo2)
def demo2():
    print('湖北省')
# @a # demo3 = a(demo3)
def demo3():
    print('台湾省')

demo1 = a(demo1)
demo1()

demo2 = a(demo2)
demo2()

demo3 = a(demo3)
demo3()

在这里插入图片描述

1、demo1 = a(demo1)  demo1 >>> print('湖南省') 是实参 demo1 = c c() >>> print('湖南省')
2、a函数的调用, a(demo1)代表它的返回值本身b,>>> demo1 = b 指向了同一片内存空间,共用一份代码
3、demo1() 相当于 b()
      print('中华人民共和国的:', end=' ')
      c()  >> print('湖南省')
  最后的结果就是:中华人民共和国的:湖南省

装饰有参数的函数

函数的三种情况:

  • 无参数 无返回值

  • 有参数 无返回值

  • 有参数 又有返回值

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

  • 装饰器带有参数的情况

def a(c):
    def b(name):
        print('中华人民共和国的:',end='')
        c(name)
    return b
@a
def demo1(name):
    print('湖南省的%s' % name)

demo1('长沙市')

在这里插入图片描述

# 不管你传过来多少的参数,都能接住,可变参数、字典参数
def a(c):
    def b(*args,**kwargs):  # 2步 name = '长沙市'
        print('中华人民共和国的:',end='')
        c(*args,**kwargs)  # 原demo1 3步 '长沙市' 函数的调用 实参
    return b
@a
def demo1(name):  # 第4步 形参接住
    print('湖南省的%s' % name)

demo1('长沙市')  # 第1步

装饰有返回值的函数

  # 有参数,又有返回值的函数
def a(c):
    def b(*args,**kwargs):  # 2步 name = '长沙市'
        print('中华人民共和国的:',end='')
        return c(*args,**kwargs)  # 原demo1 3步 '长沙市' 函数的调用 实参
    return b
    
@a # demo1 = a(demo1)
def demo1(name):  # 第4步 形参接收
    print('湖南省的%s' % name)
    return '真厉害~' # 返回值

i = demo1('长沙市')  # 第1步
print(i)

在这里插入图片描述

多个装饰器装饰一个函数

一个装饰器就是一个闭包,多个装饰器就是多个闭包

def a1(c):
    print('这是第一个装饰器。。。')
    def b1(*args,**kwargs):
        print('添加了第一种功能.。。')
        return c(*args,**kwargs) # 要被装饰的函数 >>> print('真帅气~')
    return b1

def a2(c):
    print('这是第二个装饰器***')
    def b2(*args,**kwargs):
        print('添加了第二种功能***')
        return c(*args,**kwargs) # 要被装饰的函数
    return b2

@a2 # 2、demo = a2(demo) >>> demo = b2
# 3、当下面紧挨着变成了一个函数,马上就开始进行装饰  b2 = a1(b2) >> b2 = b1
@a1 # 1、不会发生改变
def demo():
    print('真帅气~')

demo()

在这里插入图片描述
多个装饰器的分析:
在这里插入图片描述

demo = a2(a1(demo)),这样理解也是没有任何问题的

带有参数的装饰器

def a(c):
    def b(*args,**kwargs):
        print('我增加了一个功能')
        return c(*args,**kwargs)
    return b
@a
def demo():
    print('我是要被装饰的函数***')

demo()

在这里插入图片描述
关于传递参数:

def d(name):
    def a(c):
        def b(*args,**kwargs):
            print(name)
            print('我增加了一个功能')
            return c(*args,**kwargs)  # 要被装饰的函数
        return b
    return a

@d('真厉害!')
def demo():
   print('我是要被装饰的函数***')

demo()

在这里插入图片描述

装饰器总结

  • 引用
  • 闭包:1、函数嵌套函数 2、内部函数用到外部函数的数据 3、外部函数 return 内部函数引用
  • 装饰器:建立在闭包的情况下,配合 @a 的使用,只能对函数进行装饰 b = a(b)
    (作用:在不修改原函数内部代码的情况下,对其进行功能的添加)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值