Python装饰器与闭包

闭包

闭包就是外部函数中定义一个内部函数,内部函数引用外部函数中的变量,外部函数的返回值是内部函数;

# 闭包
def wrapper():
    a = 10
    print('wrapper')

    def inner():
        print(a + 20)  # 在内部函数中必须引用外部函数中定义的变量
    return inner
    
print(wrapper)  # 函数名代表的是函数在代码中的地址
 # 函数名后面带括号,表示函数引用,函数调用必然返回一个值,
 #函数调用可以看做一个值
wrapper()() 

输出结果:
在这里插入图片描述

装饰器

python中的装饰器(decorator)一般采用语法糖的形式,是一种语法格式。比如:@classmethod,@staticmethod,@property,@xxx.setter,@wraps(),@func_name等都是python中的装饰器。装饰器,装饰的对象是函数或者方法。各种装饰器的作用都是一样的:改变被装饰函数或者方法的功能、性质。

def ori(name):
    print(f"这是需要被装饰的内容...——装饰方法{name}")


# 装饰器
def outer(func):
    def inner(name):
        print("*" * 50)
        func(name)
        print("*" * 50)

    return inner

 # 此处发生偷梁换柱的概念,ori实际执行outer函数中的inner函数
ori = outer(ori) 
ori('hello_world')

输出结果:
在这里插入图片描述
增强装饰器

# 增强装饰器
@outer  # 等价于 add = outer(name)
def add(name):
    print(f"这是需要被装饰的内容...——装饰方法——{name}")


add("world hello")

输出结果:
在这里插入图片描述
装饰器改进,不限制参数

def add_outer(func):            # func 必须传入一个函数
    def inner(*args, **kwargs):
        print("*" * 50)
        # 固定用法,把传给inner实参原封不动传给被修饰的函数
        func(*args, **kwargs)   
        print("*" * 50)

    return inner

@add_outer
def demo(a, b):
    print(a + b)


@add_outer
def demo2(a):
    print(a)


demo(5, 4)
demo2(11)

输出结果:
在这里插入图片描述

装饰器使用示例——用户登录页面

NAME = '小明'
PASSWORD = '233'

# 登录方法	——需要被装饰
def login():
    name = input('请输入用户名\n')
    password = input('请输入密码\n')
    if name == NAME and password == PASSWORD:
        print('登录成功...')
        return True
    else:
        print('账号或密码不对,请重新输入...')
        return False```

# 登录逻辑
def check_login(func):
    def inner():
        if func():
            print('登录成功...')
        else:
            login()
    return inner

# 登录页面
@check_login
def manager():
    print('请登录管理中心')


manager()

输出结果:
在这里插入图片描述

类装饰器


class Decrator:
    def __call__(self, func):
        def inner(*args, **kwargs):
            print("*"*50)
            func(*args, **kwargs)
            print("*" * 50)
        return inner

@Decrator() # 类名后需加括号
def hello(name):
    print(name)
hello("小明")

输出结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值