开放封闭原则:
装饰器结构
"""
默认结构为三层!!!每层返回下一层内存地址就可以进行执行函数,
传参:语法糖中的传参可以在地二层中进行判断传入。
第一层:传送语法糖中的参数
第二层:传送外部函数的名称
第三层:传送外部函数的参数
被装饰器装饰的函数名即使没有被调用(因为有@xxx,会触发运行装饰器),
(装饰器工厂函数)定义装饰器的代码已经运行了(最内部的那个函数并没有运行),
(把被装饰的原函数引用赋值给了装饰器内部的那个函数名),当下边通过该函数名调用时,
会调用到装饰器内部的那个函数()
装饰器:在不修改函数源代码的基础上,添加函数功能
"""
def Wrapper(*args,**kwargs): #获取`@Wrapper(args)`传入参数
def Outter(func_name): #获取装饰器所装饰函数的名称
def Inner(*args,**Kwargs): #获取`def func(*args,**kwargs):`的传入参数
ret = func_name(*args,**kwargs) #执行装饰器所装饰的函数
return ret #将返回值传给被装饰的函数
return Inner #返回`Inner`的内存地址,方便调用
return Outter #返回`Outter`的内存地址,方便调用
@Wrapper(args) #`func = Outter(func) = Wrapper(args)`装饰器进行传参
def func(*args,**kwargs): #定义被装饰函数
return func.__name__ #定义函数返回值
返回装饰器的被装饰函数名
from functools import wraps
def warpper(f):
@wraps(f) #显示被装饰的函数
def inner(*args,**kwargs):
# print(f.__name__)
print(f)
return inner #
def aa():
print(1)
aa = warpper(aa)
print(aa.__name__) # 显示被装饰的函数名
账户认证(简易版)
def Wrapper(auth_type): #默认使用Wrapper名称,获取语法糖的参数
def Outer(func_name): #获取传入参数的名称
def file(*args,**kwargs): #获取传入参数的参数
print('这是在file函数中')
ret = func_name(*args,**kwargs)
print('file函数装饰完毕')
return ret
def net(*args,**kwargs):
print('这个是在网络函数中')
ret = func_name(*args,**kwargs)
print('网络函数执行结束')
return ret
if auth_type == 'localfile': #对传入参数进行判断返回不同结果
return file
elif auth_type == 'net':
return net
else:
print('该函数没有被装饰')
return Outer
@Wrapper(auth_type='net') #语法糖进行传参
def Login(username):
print(f'Welcome {username} Login.')
Login('longlong') #大神登陆啦!