在装饰器 I 中,装饰器应用之一,可以在遵循开放封闭的原则的前提下,加入新功能。但这种添加方法不完善,即:装饰多个函数,必须 “分类讨论”,无法汇总,不具备耦合性。
一个装饰器装饰多个函数(存在参数的装饰器):增强代码的耦合性。
带参数的装饰器基本形式:
def outer(n):
def middle(x):
def inner(*args,**kwargs):
……
调用 n
a = x(*args,**kwargs)
return a
retrun inner
return middle
@outer("实参")
def func():
pass
func()
Example:
def wrapper_out(n):
def wrapper(f):
def inner(*args, **kwargs):
if n == 'qq':
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
with open('qq', encoding='utf-8') as f1:
for line in f1:
user, pwd = line.strip().split('|')
if username == user and password == pwd:
print('登陆成功')
ret = f(*args, **kwargs)
return ret
return False
elif n == 'tiktok':
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
with open('tiktok', encoding='utf-8') as f1:
for line in f1:
user, pwd = line.strip().split('|')
if username == user and password == pwd:
print('登陆成功')
ret = f(*args, **kwargs)
return ret
return False
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
with open(n, encoding='utf-8') as f1:
for line in f1:
user, pwd = line.strip().split('|')
if username == user and password == pwd:
print('登陆成功')
ret = f(*args, **kwargs)
return ret
return False
return inner
return wrapper
@wrapper_out('qq')
def qq():
print('成功访问qq')
qq()
@wrapper_out('tiktok')
def tiktok():
print('成功访问抖音')
tiktok()
但是,这个思路还是有其自己的弊端,就是遇到每个被装饰的函数,都要写一层 @~,根据这一点,说明代码的耦合性无法做到最极致。
一般能用递归解决的问题,用 if 与 while 都可以搞定,使用递归在某些时候有奇效。
原文:https://www.cnblogs.com/W-Y-C/p/11086810.html