6-26 装饰器的探索

目录

			1.装饰器
		    2.装饰器的使用
		    3.通用装饰器
		    4.多个装饰器的使用
		    5.带有参数的装饰器
		    6.类装饰器

在这里插入图片描述

#encoding=utf8
def  config_name(name):
    
    def inner(msg):
        #print(name + ":" + msg)
    print(id(inner))
    
    return inner
# 创建 tom 闭包 实例(对象)
tom = config_name("tom")
#创建jerry闭包实例:
jerry = config_name("jerry")
#如果执行tom闭包因为已经保存了name参数那么以后在输入的时候都是tom:XXX

tom("郭同学,过来下,我们一起玩耍!")
jerry("打死都不去")
tom("我不吃你")
jerry("谁相信你")

#1.函数嵌套:
def func_out():
    #外部函数变量
    num1 = 10
    
    def func_inner():
        #nonlocal num1
        #num1 = 20
        #result = num1 + 10
        #print(result)
        
    print("修改前的外部变量:",num1)
    
    func_inner()
    
    print("修改后的外部变量:",num1)
    
#**

## 学习装饰器 目的,对已有函数进行额外的功能扩展

**

#装饰器的特点
#1.不修改已有函数源代码
#2.不修改已有函数的调用方式
#3.给以后函数添加额外的功能

#定义装饰器
def decorator(func):
    print("装饰器执行了")
    def inner():
        #内部函数里面对已有函数进行装饰
        print("已经添加登录验证")
        func()  #对用调用comment()函数 ,最后回到comment()
    return inner  

#装饰器的语法糖写法:@装饰器名称装饰器的语法糖就是在装饰以后函数的时候写法更加简单
@decorator   #comment = decorator(comment)  装饰器语法糖对该代码进行了封装 comment = inner
#调用方式不变
def comment():
    print("发表评论")
    
    
    
#已经添加登录验证
#发表评论

#调用装饰器对已有函数进行装饰,comment = inner
#comment = decorator(comment)
#调用方式不变
comment()  #执行comment() 就是 执行inner
#装饰器 的执行时机: 当当前模块加载完成后,装饰器会立即执行,对已有函数进行装饰


在这里插入图片描述

学习装饰器 目的,对已有函数进行额外的功能扩展

装饰器的特点
1.不修改已有函数源代码
2.不修改已有函数的调用方式
3.给以后函数添加额外的功能

##定义装饰器
def decorator(func):
    print("装饰器执行了")
    def inner():
        #内部函数里面对已有函数进行装饰
        print("已经添加登录验证")
        func()  #对用调用comment()函数 ,最后回到comment()
    return inner  
装饰器的语法糖写法:@装饰器名称装饰器的语法糖就是在装饰以后函数的时候写法更加简单
@decorator   #comment = decorator(comment)  装饰器语法糖对该代码进行了封装 comment = inner
##调用方式不变
#def comment():
    #print("发表评论")
已经添加登录验证
发表评论
#调用装饰器对已有函数进行装饰,comment = inner
comment = decorator(comment)
#调用方式不变
#comment()  #执行comment() 就是 执行inner
##装饰器 的执行时机: 当当前模块加载完成后,装饰器会立即执行,对已有函数进行装饰
#定义装饰器使用
import time
def decorator(func):
    def inner():
        #内部函数已有函数进行装饰
        #获取时间距离1970-1-1:0:0:1 的时间差
        begin = time.time()
        func()
        end = time.time()
        result = end - begin
        print("函数执行完成耗时:" ,result)
    return inner
    
@decorator #work = decorator(work) ,work = inner
def work():
    for i in range(30):
        
        print(i)
        
work()


结果:1624708323.8158884

#通用装饰器:可以装饰任意类型的函数

#-----装饰带有参数函数--------

def decorator(func):
    #使用装饰器已有函数的时候,内部函数的类型和要装饰的已有的类型保持一致
    def inner(a,b):
        #内部函数已有函数进行装饰
        print("正在努力执行加法中")
        func(a,b)
    return inner


@decorator # 用装饰器语法糖方式装饰带有参数的函数
def add_num(num1,num2):
    result = num1 + num2
    print("结果:" , result)

add_num(1,2)

**

通用装饰器:可以装饰任意类型的函数

**

#-----装饰带有参数函数--------

def decorator(func):
    #使用装饰器已有函数的时候,内部函数的类型和要装饰的已有的类型保持一致
    def inner(a,b):
        #内部函数已有函数进行装饰
        print("正在努力执行加法中")
        num = func(a,b)
        return num
    return inner


@decorator # 用装饰器语法糖方式装饰带有参数的函数
def add_num(num1,num2):
    result = num1 + num2
    print("结果:" , result)

add_num(1,2)


正在努力执行加法中
结果: 3

通用装饰器:可以装饰任意类型的函数

 #-----装饰带有不定长参数和返回值的函数--------
 #装饰器还可以成为是通用的
 #def decorator(func):
     ##使用装饰器已有函数的时候,内部函数的类型和要装饰的已有的类型保持一致
     #def inner(*args,**kwargs):
         #内部函数已有函数进行装饰
         print("正在努力执行加法计算")
         num = func(*args,**kwargs)
         #*args :元组里面每一个元素,按照位置参数的方式进行传参
         #**kwargs :把字典里面的每一个键值对,按照关键字的方式进行传参
         #这里对元组和字典进行拆包,仅仅限于结合不定长参数的函数使用
         
         return num
     return inner
 
 ## 用装饰器语法糖方式装饰带有参数的函数-------
 #@decorator  #add_nm = decorator(add_num),add_num = inner
 #def add_num(*args,**kwargs):
     result = 0
     # *args:元组类型
     # **kwargs:字典类型
     
     #遍历元组字典values
     for value in args:
         #result += value
         
     for value in kwargs.values():
         result += value
         
      return result
     
result = add_num(1,2)      
print("结果:" , result)

#if __name__ == '__main__':
    ##my = {"a":1}
    ## print(**my)

def decorator(func):
  #使用装饰器已有函数的时候,内部函数的类型和要装饰的已有的类型保持一致
  def inner(*args,**kwargs):
      #内部函数已有函数进行装饰
      print("正在努力执行加法计算")
      num = func(*args,**kwargs)
      #*args :元组里面每一个元素,按照位置参数的方式进行传参
      #**kwargs :把字典里面的每一个键值对,按照关键字的方式进行传参
      #这里对元组和字典进行拆包,仅仅限于结合不定长参数的函数使用
      
      return num
  
  return inner


@decorator #show = decorator(show) show = inner
def show():
    return "哈哈"
    
result = show()
print(result)

"""
正在努力执行加法计算
哈哈

"""

**

函数自带_call_方法

**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值