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


原文地址:https://www.cnblogs.com/yftzw/p/8670018.html