# 装饰器:
# 开闭原则(开放封闭原则):对添加功能开放,对修改代码封闭
#举个例子,给一个函数,在不修改原来代码的基础上,添加新功能。
#无参数无返回值
def func():
print('捏泥人,吹口气')
#装饰器 - 如果天气干燥,需要加水
def wrapper(fn):
def inner():
print('加水')
fn()
return inner #返回inner这个函数地址
# fun = wrapper(func) #inner这个函数地址
# fun() #调用inner函数
#但是我们不能把功能名字改了,所以
func = wrapper(func) # 我们还用原来的名字替换
func()
#有参数无返回值
def func(name,name1):
print('你好',name,name1)
def wrapper(fn):
def inner(*args,**kwargs): # 聚合
fn(*args,**kwargs) #打散
print('我想和你做朋友',args)
return inner
func = wrapper(func) #inner
func('Tom','Jenny')
# 有参数有返回值
def func(name,name1):
print('你好',name,name1)
return name
def wrapper(fn):
def inner(*args,**kwargs): # 聚合
name = fn(*args,**kwargs) #打散 接收原函数的返回值
print('我想和你做朋友',args)
return name
return inner
func = wrapper(func) #inner
print(func('Tom','Jenny')) #返回值为name
def wrapper(fn):
def inner(*args,**kwargs): # 聚合
name = fn(*args,**kwargs) #打散 接收原函数的返回值
print('我想和你做朋友',args)
return name
return inner
@wrapper # 语法糖 相当于 func = wrapper(func)
def func(name,name1):
print('你好',name,name1)
return name
#总结
def wrapper(fn):
def inner(*args,**kwargs):
目标函数之前要做的操作
re = fn(*args,**kwargs) re为返回值
目标函数之后要做的操作
return re
return inner
在要用装饰器的函数前加上 @wrapper(语法糖)
# 函数的注释
def test_1(name):
"""
这个函数是测试函数
:param name: 指的是函数的参数
:return: 函数的返回值
"""
pass
#将被装饰过的函数某些属性改变成原有函数的属性值
from functools import wraps
def wrapper(fn):
@wraps(fn)
def inner(*args,**kwargs):
"""目标函数之前要做的事情"""
ret = fn(*args,**kwargs)
"""目标函数之后要做的事情"""
return ret
return inner
@wrapper
def test_2():
print('I am test_2')
test_2()
print(test_2.__name__) # test_2 打印函数的名字
print(test_2.__doc__) # 函数的注释
#带参数的装饰器 - 天气干燥,就浇水
def wrapper_out(arg):
def wrapper(fn):
def inner(*args,**kwargs):
if arg:
print('天气干燥,浇水')
ret = fn(*args, **kwargs)
else:
ret = fn(*args,**kwargs)
return ret
return inner
return wrapper #返回一个装饰器
@wrapper_out(True) #先执行@后面的函数,返回一个解释器 ,再和@组合成语法糖
def shenhua():
print('女娲捏泥人')
shenhua()
#多个装饰器装饰一个函数
def wrapper_1(fn):
def inner(*args,**kwargs):
print('wrapper_1 前')
ret = fn(*args,**kwargs)
print('wrapper_1 后')
return ret
return inner
def wrapper_2(fn):
def inner(*args,**kwargs):
print('wrapper_2 前')
ret = fn(*args,**kwargs)
print('wrapper_2 后')
return ret
return inner
@wrapper_1 # []
@wrapper_2 # ()
def test():
print('我是目标函数')
test()
"""
执行结果:
wrapper_1 前
wrapper_2 前
我是目标函数
wrapper_2 后
wrapper_1 后
遵循原则:
[(目标)] 从左向右依次执行
"""
#迭代器 - 将索引和元素一起迭代出来
lst = ['周杰伦','周星驰','吴彦祖','刘德华']
for index,ele in enumerate(lst):
print(index,ele)
"""
0 周杰伦
1 周星驰
2 吴彦祖
3 刘德华
"""
#编码和解码
s1 = "目标"
UTF_bytes = s1.encode('utf-8') #编码 将汉字编码成字节 一个汉字三个字节
print(UTF_bytes)
s = UTF_bytes.decode('utf-8') #解码 将字节解码成汉字
print(s)
GBK_bytes = s.encode('GBK') #一个汉字两个字节
print(GBK_bytes)