目录
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_方法
**