Python装饰器与闭包

文章介绍了Python中的闭包和装饰器概念,包括闭包的定义、装饰器的语法糖形式以及它们在函数和方法上的应用。通过示例展示了如何使用装饰器改变函数功能,包括普通装饰器、增强装饰器和不限制参数的装饰器。此外,还探讨了装饰器在用户登录页面的登录逻辑中的应用以及类装饰器的实现方式。
摘要由CSDN通过智能技术生成

闭包

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

# 闭包
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("小明")

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值