引用、闭包、装饰器

tech2022-08-06  119

引用

# 引用 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)