# 回调函数就是一个参数,将这个函数作为参数传到另一个函数里面,
# 当那个函数执行完之后,再执行传进去的这个函数。这个过程就叫做回调。
def funa(fun):
fun() # 调用的是funb函数
print('这是funa函数')
def funb():
print('这是funb函数')
funa(funb) # funb当作一个参数传递给funa() fun==funb
# # 定义一个添加家具的函数
# def add(house):
# house() # 运行要传入的函数--》house1()
# print('双人床')
# # 定义一个普通的函数
# # 需求:添加一张双人床
# def house1():
# print('毛坯房')
# print('两室一厅一卫')
# print('装修完成,准备家具')
#
# add(house1)
'''
装饰器需要满足以下两点:
1.不修改原程序或函数的代码
2.不改变函数或程序调用方法。
'''
'''
装饰器构成条件:
1、在内部嵌套(函数里面再定义函数)的前提下
2、内部函数使用了外部函数的变量或参数
3、外部函数返回了内部函数的函数名
4、外部函数的参数是以函数的形式使用的
'''
# 装饰器本质上就是一个闭包函数
# 定义一个添加家具的装饰函数
# def add(house): # 外部函数
# def inner(): # 内部函数
# # 2、内部函数使用了外部函数的变量或参数
# # 执行被装饰的函数(传入的函数)
# h1 = house() # house相当于调用house1()
# print('双人床')
# # 把这个新的函数作为本函数返回值返回出去
# return h1
# # 3、外部函数返回了内部函数的函数名
# return inner
#
# # 被装饰的函数
# def house1():
# print('毛坯房')
# print('两室一厅一卫')
# print('装修完成,准备家具')
#
# # 使用装饰器来装饰函数
# h1 = add(house1) # house1当作一个参数传给add函数
# # 等价于执行装饰器里面的inner函数
# h1() # --》执行闭包
# 语法糖
# 定义一个添加家具的装饰函数
def add(house): # 外部函数
def inner(): # 内部函数
# 2、内部函数使用了外部函数的变量或参数
# 执行被装饰的函数(传入的函数)
h1 = house() # house相当于调用house1()
print('双人床')
# 把这个新的函数作为本函数返回值返回出去
return h1
# 3、外部函数返回了内部函数的函数名
return inner
# 定义一个打扫功能的装饰器
def clean(house):
def inner():
h1 = house()
print('打扫中')
return h1
return inner
# 使用语法糖来装饰函数 语法:@装饰器的名称
@clean
@add
# 注意:是@add而不是@add(),@是装饰器的引用,add则是执行了这个函数
# 如果这个值不是一个装饰器的话会报错
# 注意:离被装饰的函数最近的装饰器先装饰,然后我们的装饰器再装饰
# 被装饰的函数
def house1():
print('毛坯房')
print('两室一厅一卫')
print('装修完成,准备家具')
# 调用被装饰的函数
house1()
# 当装饰器中有两个形参
# 定义一个登录的装饰器函数 --》验证是否登录
def login(funa, funb):
def inner():
print('是否登录:已经登录成功!')
# 执行被装饰的函数
funa() # funa实际上就是test1函数调用
# 执行被装饰的函数
funb() # funb实际上是test2的调用
return inner
# 被装饰的函数1 --》发表评论
def test1():
print('发表评论:美女真好看!')\
# 被装饰的函数2 --》发朋友圈
def test2():
print('发朋友圈:今天学了装饰器!')
# 调用login装饰
log = login(test1, test2)
# 调用装饰器里面的inner函数
log()
# 被装饰的函数无参数
# 定义装饰器函数
def outer(fun):
def inner():
# 执行被装饰的函数
fun()
print('这个是inner函数')
return inner
# 使用语法糖装饰’
@outer
# 定义被装饰的函数
def func():
print('这是func')
print('这是被装饰的函数')
func()
# 被装饰的函数有参数
# 定义装饰器函数 --》打印相加的值
def outer(add1):
def inner(a, b):
print('相加的值:{},{}'.format(a, b))
add1(a, b)
return inner
@outer
# 被装饰的函数--》相加
def add(a, b):
print(f'结果是:{a+b}')
add(1, 2)
# 被装饰的函数有不定长参数 *args **kwargs
# 定义装饰器函数
def outer(test1):
def inner(*args, **kwargs):
print('开始执行被装饰的函数')
# 执行被装饰的函数 -->调用函数的时候也一样要写
test1(*args, **kwargs) # 因为可变参数不传参一样可以执行。传值也照样执行
print('执行完成')
return inner
# 定义被装饰的函数
def test(*args, **kwargs):
print(args)
print(kwargs)
# 调用outer装饰
ot = outer(test)
# 调用装饰器里面的inner函数
ot()
ot('123', '456', '789', age=18)
# 定义装饰器:实现的效果--》{(人生苦短,我学python)}
# 定义第一个装饰器 --》{}
def deco1(test1):
def inner():
return "{" + test1() + "}"
return inner
# 定义第二个装饰器 --》()
def deco2(test1):
def inner():
return "(" + test1() + ")"
return inner
# 使用语法糖
@deco1
@deco2
# 被装饰的函数 --》人生苦短,我学python
def test():
return '人生苦短,我学python'
print(test())
Python之装饰器
最新推荐文章于 2024-11-05 15:28:12 发布