有参装饰器
相对于无参装饰器,在无参装饰器的基础上在包一层 闭包函数,无参装饰器的模板是不可以修改的 否则会改变函数的调用方式与传参方式 为了解决除了不修改之外的方法,必须在包一层
@的使用规则
@加函数名 不带括号 ,执行方式是 将@下面的定义函数名放到装饰器内增加扩展功能,在重新命名的过程。
@加函数名加括号跟着参数形如@deco(mode='r') 执行方式是 先执行deco(mode='r')得到返回值 再将返回值放在@后面 在进行与无参装饰器一样的步骤
有参装饰器 是将一个分支条件的扩展装饰给函数,比如 认证的方式有好几种 直接密码认证 或者通过数据库认证 还可以是其他认证方式
定义有参与无参装饰器
只是加一些一般扩展 不需要额外参数的 就定义为无参装饰器
需要参数作为条件分支的可以定义为有参装饰器
def o(str_='a'): #带默认值的有参装饰器 将值传递给分支结构
def outter(func):
def wrapper(*args, **kwargs):
if str_ == 'a':
inp_name = input('please input your name:').strip()
inp_pwd = input('please input your pwd:').strip()
with open('use.db', 'rt', encoding='utf-8') as f:
for line in f:
name_db, pwd_db = line.strip().split(':')
if inp_name == name_db and inp_pwd == pwd_db:
print('login successful')
res = func(*args, **kwargs)
return res
else:
print('print error')
elif str_ == 'b':
print('走b的路线')
return wrapper
return outter
@o()
def f():
print('hahhhahaha')
return 12
迭代器
![]()