3.29 装饰器
装饰器
开放封闭原则
软件一旦上线后就该遵循开放封闭原则,对修改源代码是封闭的,对功能的扩展是开放的,也就是说我们必须找到一种解决方案
能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能
总结
原则如下:1.不修改源代码
2.不修改调用方式
目的
在遵守1和2原则的基础上扩展新功能
器指的工具 装饰器指的是为被装饰器对象添加新功能
装饰器即不在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能
装饰器与被装饰的对象均可以是任意可调用对象
装饰器☞函数
装饰器对象☞函数
装饰器基本模块
def ourtter(fuck)
def inner(*args,**kwargs)
res=fuck(*args,**kwargs)
return res
return inner
f=ourtter()
f()
无参函数
import time
a_path='a.txt'
def outter(fuck):
def supper(*args, **kwargs):
name = input('用户名>>:').strip()
pwd = input('密码>>:').strip()
with open(r'%s' % a_path, 'r')as f:
for line in f:
if name and pwd in line:
print('登陆成功')
res = fuck(*args, **kwargs)
else:
print('用户或密码错误')
return supper
@outter
def index():
time.sleep(3)
print('我是神经病!!!')
return 123
index()
有参函数
import time
current_user={
'username':None,
# 'login_time':None
}
def auth(engine):
# engine='file'
def auth2(func):
# func=index
def wrapper(*args,**kwargs):
if engine == 'file':
if current_user['username']:
print('已经登陆过了')
res=func(*args,**kwargs)
return res
uname=input('用户名>>: ').strip()
pwd=input('密码>>: ').strip()
if uname == 'egon' and pwd == '123':
print('登陆成功')
current_user['username']=uname
res=func(*args,**kwargs)
return res
else:
print('用户名或密码错误')
elif engine == 'mysql':
print('基于MyQL的认证')
elif engine == 'ldap':
print('基于LDAP的认证')
return wrapper
return auth2
@auth('ldap') #@auth2 #index=auth2(index) #index=wrapper
def index():
time.sleep(1)
print('welcome to index page')
return 122