Python装饰器

闭包:

1.函数内的属性是有生命周期的,生命周期都是在函数执行期间
2.内部函数对外部函数作用域里变量的引用
3.闭包内的闭包函数私有化了变量,完成了数据的封装,类似于面向对象
def func1():#外部函数
    print('this is func1')
    def func2(num):#内部函数
        print('this is func2')
func1()
# func2()  #创建过程在func1函数的执行过程中,报错:func2未被定义


```python
def func1():#外部函数
    print('this is func1')
    def func2():#内部函数
        print('this is func2')
    return func2
func1()
# func2()  #创建过程在func1函数的执行过程中
var = func1()  #将外部函数的返回值,也就是内部函数存储在一个变量里
var() #调用func2()
def func1():#外部函数
    a=1 #外部函数作用域里的变量
    print('this is func1')
    def func2(num):#内部函数
        print('this is func2')
        print(num+a)
    return func2
func1()
# func2()  #创建过程在func1函数的执行过程中
var = func1()  #将外部函数的返回值,也就是内部函数存储在一个变量里
var(3) #执行结果为4

#使用闭包实现,将列表中的第一个元素累加1

mylist = [1,2,3,4,5]
def func1(obj):
    print('func1:',obj)
    def func2():
        obj[0]+=1
        print('func2',obj)
    return func2
var = func1(mylist)
 #输出func1:[1,2,3,4,5]
var()
#输出func2:[2,2,3,4,5]
var()
#输出func2:[3,2,3,4,5]
var()#输出func2:[4,2,3,4,5]

装饰器:

  1.不影响原有函数的功能,还能添加新的功能,常见,拿到第三方的API,我们需要添加一些功能时需要用到装饰器

d

ef func1(func): #外部闭包函数的参数是被装饰的函数对象
    def func2():
        func()
#func()函数其实调用的就是myprint()函数
        print('aaaaaaaaaabbbbbbbb')
        func() #返回了外部函数接收的参数,被装饰函数的调用
    return func2
#return func #返回了函数对象
#return func() #返回的是一个函数调用
#func1(myprint)() #接收被装饰的函数作为参数,而且还要继续调用一次
@func1 #装饰器将myprint()函数传入func1()中,然后func2()先打印aaabbb,而后再执行myprint()函数
def myprint():
        print('你好,我是print')
myprint()
打印结果:
你好,我是print
aaaaaaaaaabbbbbbbb
你好,我是print

#装饰器示例

def arg_func(sex):
    def func1(func_1):
        def func2():
            func_1()
 #调用被装饰函数
            if sex == 'man':
                print('你需要养家')
            elif sex == 'woman':
                print('你不需要养家')
            else:
                print('你需要好好学习')
        return func2
    return func1

@arg_func(sex='man')
def man():
    print('你是男人,')
@arg_func(sex='woman')
def woman():
    print('你是女人,')
@arg_func(sex='child')
def child():
    print('你是孩子,')

man()
woman()
child()
打印结果:
你是男人,
你需要养家
你是女人,
你不需要养家
你是孩子,
你需要好好学习
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值