闭着眼就能学会的装饰器

目录

一,闭包 

1,闭包函数含义以及三要素

2,定义一个简单的闭包

二,装饰器

1,装饰器的作用场景以及特点

2,定义一个简单的装饰器

1,需求1

2,需求2

三,装饰器的实例

1.排序并比较排序用时

2.添加身份校验


一,闭包 

1,闭包函数含义以及三要素

闭包函数是指在一个函数内部定义的函数,该内部函数可以访问外部函数的变量和参数,并且可以在外部函数执行结束后继续访问和操作这些变量和参数。

1,外层函数嵌套内层函数

2,内层函数可以访问外层函数的局部变量

3,外层函数可以返回内层函数

2,定义一个简单的闭包

def outer_func():
    x = 10

    def inner_func():
        print(x)

    return inner_func

closure = outer_func()
closure()  # 输出:10

外层函数嵌套内层函数

这里的closure返回的是外层函数执行的结果,也就说内层函数

外层函数返回内层函数

内层函数可以访问外层函数的局部变量  x = 10

closure()执行的就是内层函数inner_func 的函数内容

二,装饰器

1,装饰器的作用场景以及特点

装饰器的作用是在被装饰函数的前后添加一些额外的操作,而无需修改原始函数的定义。这样可以实现代码的复用和功能的组合。常见的应用场景包括日志记录、性能统计、权限验证等。

用于在保持原始代码不变的情况下对其进行功能扩展或修改。

装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。

2,定义一个简单的装饰器

1,需求1

实现一个简单的需求 打印“hello”

def say_hello():
    print(f'hello')


say_hello()

2,需求2

现在要求在原有函数不变的前提下,增加一个功能:实现打印(小米 hello)

def say_hello_xm(f):
    def xm():
        f()

    return xm

这是一个闭包

根据闭包的用法

把say_hello 当作变量赋予say_hello_xm

def say_hello_xm(f):
    def xm():
        f()

    return xm

def say_hello():
    print(f'hello')

say_hello() =  say_hello_xm(say_hello)

say_hello()

 在python中也有一个对于装饰器的表达

在要被装饰的函数前      @装饰器函数名

def say_hello_xm(f):
    def xm():
        f()

    return xm

@say_hello_xm
def say_hello():
    print(f'hello')



say_hello()

这就是一个简单的装饰器   在原有函数不变的前提下,对其增加新的功能

三,装饰器的实例

1.排序并比较排序用时

对列表以及他的浅copy列表进行排序
额外需求 : 在不改变函数内容的前提下,比较排序用时


# 有额外形参的  可以规定排序的方式“升序/倒序”
# 引入一个形参  sort_type  默认是False 正序   (=True则是倒序)
datas = [random.randint(0, 10000) for i in range(1000)]
# 随机1000个数
datas_copy = datas.copy()


# f 就是要加工的函数
def add_function(f):
    def function(sort_type):
        stat = time.time()
        f(sort_type)
        print(f'{f.__name__} 用时{time.time() - stat}')

    return function


# 闭包

# 把my_fun1的全部赋予了f
# 外部函数又返回内部函数
# 内部函数又调用f()

@add_function  # python中规定的,这就是把其下函数用  add_function  去装饰
def my_fun1(sort_type):
    datas.sort(reverse=sort_type)
    print(datas)


@add_function
def my_fun2(sort_type):
    new_list = sorted(datas_copy, reverse=sort_type)
    print(new_list)

2.添加身份校验

显示主页面,用户页面,购物车页面

额外需求:在进入用户以及购物车页面前需要进行用户登录

user = None
def login_required(f):
    def check():
        global user
        if user:
            f()
        else:
            while True:
                user_name = input(f'输入用户名')
                pwd = input(f'输入密码')
                if user_name == '小龙' and pwd == '1230':
                    f()
                    user = '小龙'
                    break
                else:
                    print(f'用户名或密码错误')
    return check


def home():
    print(f'我是首页')


@login_required
def user_center():
    print(f'我是用户中心')


@login_required
def shopping_cart():
    print(f'我是购物车')


home()

user_center()

shopping_cart()

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值