首页 > 其他分享 >闭着眼就能学会的装饰器

闭着眼就能学会的装饰器

时间:2024-07-25 16:00:58浏览次数:8  
标签:函数 xm 学会 装饰 say 着眼 print hello def

目录

一,闭包 

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()

标签:函数,xm,学会,装饰,say,着眼,print,hello,def
From: https://blog.csdn.net/2401_86120670/article/details/140619557

相关文章

  • 关于 Python 中装饰器缓存的困惑
    我正在使用Python装饰器来实现函数的缓存。我了解缓存结果以提高性能的基本概念,但我正在努力解决如何处理不同的函数参数并确保底层数据更改时缓存更新。我已经实现了一个基本装饰器,它将函数结果存储在基于参数的字典。但是,此方法无法处理函数参数可能具有复杂结构(如嵌套列......
  • 巴黎奥运会来了,奥运相关英文词汇你学会了吗?【爱秀英语】
    奥运不仅是一场体育竞技的盛会,也是一个文化交流的平台。最近刚好巴黎奥运会要开始了,我们一起来学习下是与奥运相关的英语口语词汇,帮助你更好地理解和参与奥运话题的交流:OpeningCeremony开幕式-奥运会正式开始前的盛大庆典,展示主办国的文化与传统。ClosingCeremony......
  • [二、状态管理]2管理组件拥有的状态(5)@Observed装饰器和@ObjectLink装饰器:嵌套类对象属
    上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型。对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第二层的属性变化是无法观察到的。这就引出了@Observed/@ObjectLink装饰器。说明从APIver......
  • 通过装饰器打印最大值与根据传入参数进行打印次数
    点击查看代码#写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,把每次结果添加到列表中,最终返回列表。defxxx(counter):print('x函数')defwrapper(func):print('wrapper函数')definner(*args,**kwargs):v=[]......
  • WebKit的文本装饰艺术:CSS Text Decoration全解析
    WebKit的文本装饰艺术:CSSTextDecoration全解析CSS文本装饰(TextDecoration)是一组用于美化和增强网页文本表现的属性,它们可以为文本添加下划线、上划线、线删除和强调标记等效果。WebKit作为许多现代浏览器的渲染引擎,对CSS文本装饰的支持非常全面。本文将深入探讨WebKit对......
  • 什么是Python中的闭包与装饰器
    1.闭包闭包(Closure)是指在一个函数内部定义的函数,并且这个内部函数可以访问其外部函数作用域中定义的变量。在Python中,闭包是一个强大且灵活的编程工具,可以实现许多有趣和实用的功能。让我们通过一个简单的示例来说明闭包的基本概念:defouter_function(x):definner_f......
  • python闭包和装饰器
    一、闭包1.闭包的三要素1.外部函数嵌套内部函数2.内部函数可以调用外部函数的局部变量3.外部函数返回内部函数2.示例代码 #外部函数deffunc1():print("func1")#内部函数deffunc2():print("func2")#外部函数返回内部函数re......
  • 计数调用装饰器 - 为什么我将函数属性重置回 0?
    下面的代码计算了装饰函数func被调用的次数:fromfunctoolsimportwrapsdefcounting_calls(func):@wraps(func)definner(*args,**kwargs):inner.call_count+=1returnfunc(*args,**kwargs)inner.call_count=0returninner......
  • 在 Flask-SQLAlchemy 模型类中使用数据类装饰器?
    我编写了一个Flask-SQLAlchemy模型类,如下所示(来自此参考):fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyapp=Flask(__name__)db=SQLAlchemy(app)classUser(db.Model):__tablename__='user'user_id=db.Column(d......
  • 鸿蒙HarmonyOS开发:@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化
    文章目录一、装饰器二、概述三、限制条件四、装饰器说明五、Toggle组件1、子组件2、接口3、ToggleType枚举4、事件六、示例演示1、代码2、效果一、装饰器@State装饰器:组件内状态@Prop装饰器:父子单向同步@Link装饰器:父子双向同步@Provide装饰器和@Consume装饰器:与......