闭包与装饰器

2018-03-11  本文已影响0人  豆豆_50dd

闭包:

函数内的属性,都是有生命周期,都是在函数执行期间
内部函数对外部函数作用域变量的引用
闭包内的闭包函数私有化变量,完成了数据的封装,类似于面向对象

#!/usr/bin/python
# -*- coding: UTF-8 -*-
def func():#外部函数
   a = 1    #外部函数作用域的变量
   print('this is func')
   def func1(num):       #内部函数
      print('this is func1')
      print(num + a)
   return func1  #返回函数 
#func() 运行外部函数,内部函数就被创建了
var = func() #创建过程在func函数的执行过程中
#var == func1 
var(3)
var(4)
内存.jpg

外部函数func在调用后,内存没有了外部函数,但是返回了内部函数(闭包函数)func1,而var==func1。而外部函数的变量a被内部函数引用。

装饰器

装饰器不影响原有函数的功能,添加新的功能。装饰器就是一种的闭包的应用

一、普通装饰器
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def func1(func):      #外部闭包函数的参数是被装饰的函数对象
   def func2():
      print('aaabbb')
      return func()#返回了外部函数接收的被装饰函数的调用
   return func2

#return func #返回了函数对象
#return func() #返回的是一个函数调用
@func1
def myprint():
   print('你好,我是print')

myprint()
二、装饰器函数带参数
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def arg_func(sex):
   def func1(b_func):
      def func2():
         if sex == 'man':
            print('你不可以生娃')
         if sex == 'woman':
            print('你可以生娃')
         return b_func()
      return func2
   return func1

@arg_func(sex='man')
def man():
   print('好好上班。')

@arg_func(sex='woman')
def woman():
   print ('好好上班。')

man()
woman()
三、被装饰和函数带参数
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def func1(func):
   def func2(x,y):
      print(x,y)
      y += 5
      x += 5
      return func(x,y)
   return func2

@func1
def mysum(a,b):
   print(a+b)
mysum(1,5)
上一篇 下一篇

猜你喜欢

热点阅读