有参装饰器 相对于无参装饰器,在无参装饰器的基础上在包一层 闭包函数,无参装饰器的模板是不可以修改的 否则会改变函数的调用方式与传参方式 为了解决除了不修改之外的方法,必须在包一层 @的使用规则 @加函数名 不带括号 ,执行方式是 将@下面的定义函数名放到装饰器内增加扩展功能,在重新命名的过程。 @加函数名加括号跟着参数形如@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
迭代器