装饰器

发布时间 2023-12-11 17:02:20作者: Formerly0^0

装饰器

1.装饰器

  • 再不修改被装饰对象的源代码和调用方式的的前提下为装饰对象添加额外的功能

1.1装饰器分类

  • 分为无参装饰器和有参装饰器
  • 无参装饰器
# 无参装饰器模版
def outer(func):
   def inner():
      '''这里写调用 func 函数之前的逻辑'''
      res = func()
      '''这里写调用 func 函数之后的逻辑'''
      return res
    return inner

# 语法糖调用
@outer
def add():
  return 1

# 变量赋值调用
add = outer(add)
add()

# 示例
login_user_dict = {'username': 'serein', 'is_admin': True}
user_data_dict = {'serein': {'password': 521, 'role': 'admin'},
                  'formerly': {'password': 369, 'role': 'normal'}}

def check_admin(func):
  def inner():
    if login_user_dict['username'] and login_user_dict["is_admin"]:
      res = func()
      return res
    else:
      return False,"登陆失败"
    
    return inner

@check_admin
def get_money():
  return True,"取款成功"

# 第一种调用方法
# 调用check_admin方法,传入参数get_money
get_money = check_admin(get_money)
get_money()	# get_money加()执行inner方法
print(get_money)	# 取款成功

# 第二种方法,语法糖,在get_money方法上面加@check_admin
get_money()
  • 有参装饰器
# 有参数装饰器模版
def outer(func):
    def inner(*args,**kwargs):
        '''这里写调用 func 函数之前的逻辑 直接校验年龄'''
        res = func(*args,**kwargs)
        '''这里写调用 func 函数之后的逻辑'''
        return res
    return inner
 
@outer
def add(*args,**kwargs):
    print(args)
    print(kwargs)

add(888,x=999)


# 示例
# 看电影
# 用户信息字典 --- 定义用户名 和 年龄
# 大于 18 岁 看电影
# 小于 18 岁  18禁

# 看电影 ==》 验证年龄(装饰器验证年龄)

# 装饰器模板
user_info = {"serein": 17, 'chenxu': 22}
def outer(func):
  def inner(name):
    if user_info.get('name') >= 18:
    	res = func(name)
    	return res
    else:
      return "18禁"
  return inner

@outer
def see(name):
  return f"{name},在看电影"

see('serein')	# 18禁
see('chenxu')	# chenxu,在看电影