首页 > 其他分享 >装饰器

装饰器

时间:2023-12-13 16:23:21浏览次数:16  
标签:outer see func return 装饰 def

装饰器

(一)什么是装饰器

  • 装饰:代指为被装饰对象添加新的功能。
  • 器:代指器具/工具。
  • 装饰器与被装饰对象均可以是任意可调用对象。

装饰器定义:

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

装饰器经常用于有切莫需求的场景

  • 插入日志、性能测试、事物处理、缓存、权限校验等应用场景。
  • 有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

(二)装饰器的作用

  • 软件的设计应该遵循开放封闭原则,即对扩展是开放的,而对修改是封闭的。
    • 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
    • 对修改封闭,意味着对象一旦设计完成,就可以独立完成其工作,而不要对其进行修改。
  • 软件包含的所有功能的源代码以及调用方式,都应该避免修改,否则一旦改错,则极有可能产生连锁反应,最终导致程序崩溃
    • 而对于上线后的软件,新需求或者变化又层出不穷,我们必须为程序提供扩展的可能性,这就用到了装饰器。

(三)装饰器的分类

  • 函数装饰器分为:
    • 无参装饰器
    • 有参装饰器
  • 二者的实现原理一样,都是函数嵌套+闭包+函数对象的组合使用的产物。

(四)无参装饰器

(1)计时

  • 始终遵循不修改被装饰对象的源代码
import time
#计时
def index():
    time.sleep(5)
    print('哈哈')

start_time=time.time()
index()
end_time=time.time()
print(end_time-start_time)
# 哈哈
# 5.0000951290130615

(2)无参装饰器模板

"""装饰器标准模板"""
def add():
    return 1
def outer(func):
    def inner():
        """调用func 函数之前的逻辑"""
        res=func()
        """调用函数func 函数之后的逻辑"""
        return res
    return inner
add=outer(func=add)
add()

小练习:

# 看电影
# 用户信息字典 --- 定义用户名 和 年龄
# 大于 18 岁 看电影
# 小于 18 岁  18禁
user_info_dict={'syh':10}
def outer(func):
    def inner():
        if user_info_dict['syh']>=18:
            res=func()
            return res
        else:
            return '18禁'
    return inner
# @outer
#调用一
def see():
    return '看电影!'
see=outer(func=see)
print(see())


#调用二语法糖
@outer#see=outer(func=see)
def see():
    return '已成年可以观看!'
print(see())



#校验是否是管理员!
user_info_dict={'username':'syh','is_admin':True}
def outer(func):
    def inner():
        if user_info_dict['username'] and user_info_dict['is_admin']:
            res=func()
            return res
        else:
            return False,'此人不是管理员!'
    return inner

@outer
def add():
    return True,'此人是管理员!'
print(add())

装饰器语法糖

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

user_info_dict={'syh':20}
def outer(func):
    def inner():
        if user_info_dict['syh']>=18:
            res =func()
            return res
        else:
            return '未满18,不能观看电影!'
    return inner
#装饰器语法糖
@outer#==see=outer(func=see)
def see():
    return '看电影!'
print(see())

(五)有参装饰器

(1)有参装饰器模板

"""有参装饰器模板"""
def outer(func):
    def inner(*args,**kwargs):
        """调用func函数之前的逻辑,校验"""
        res=func(*args,**kwargs)
        """调用func函数之后的逻辑"""
        return res
    return inner
def add(*args,**kwargs):
    print(args)
    print(kwargs)
add(1,x=888)

练习

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

def outer(func):
    def inner(name,age):
        if age>=18:
            res=func(name,age)
            return res
        else:
            return f'{name}才不能观看电影'
    return inner


def see(name,age):
    return f'{name}已经了,可以看电影'
see=outer(func=see)
print(see('syh',18))

"""装饰器语法糖"""
@outer #==see=outer(func=see)
def see(name,age):
    return f'{name}已经了,可以看电影'
# see=outer(func=see)
print(see('syh',18))

标签:outer,see,func,return,装饰,def
From: https://www.cnblogs.com/suyihang/p/17899301.html

相关文章

  • 装饰器
    【一】装饰器装饰器(Decorator)是一种用于修改函数或类行为的特殊函数。它可以在不修改原始函数或类定义的情况下,通过添加额外的功能或行为来扩展其功能。装饰器的主要作用是增强函数或类的功能,常见的应用场景包括:函数装饰器:函数装饰器可以在不修改原函数代码的情况下,对函数进行......
  • Python高级之装饰器
    装饰器【一】装饰器介绍装饰器的由来软件的设计应该遵循开放封闭原则,即对扩展是开放的,而对修改是封闭的。对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改封闭,意味着对象一旦设计完成,就可以独立完成其工作,而不要对其进行修改。软件包......
  • 装饰器模式
    装饰器,顾名思义,一个是待装饰者,一个是装饰者,就像我们早餐吃的煎饼,煎饼是待装饰者,其他的火腿、里脊、土豆丝、生菜等都是装饰者,但最终都没有改变这还是一个煎饼。这里代码上有两个重要的点,一个是装饰者会也会继承或者实现被装饰者,第二是装饰者的构造函数会有一个类型为待装饰者的参......
  • 装饰器
    装饰器装饰器的作用就是在不修改被装饰对象源代码和调用方式的前提下为被装饰对象添加额外的功能装饰器经常用于有切面需求的场景插入日志、性能测试、事务处理、缓存、权限校验等应用场景有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用【一】装饰......
  • 装饰器
    装饰器装饰器的作用就是在不修改被装饰对象源代码和调用方式的前提下为被装饰对象添加额外的功能装饰器经常用于有切面需求的场景插入日志、性能测试、事务处理、缓存、权限校验等应用场景有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用【一】装饰......
  • [-007-]-Python3+Unittest+Selenium Web UI自动化测试之@property装饰器默认值设置
    看示例:#!/usr/bin/python3#coding:utf-8__author__='csjin'#定义@property装饰器classPPTListModels(object):def__init__(self):self._tab_name="PPT模板"@propertydefhandle(self):returnself.__handle......
  • 【python基础之装饰器】---装饰器
    title:【python基础之装饰器】---装饰器date:2023-12-1118:54:06updated:2023-12-1214:30:00description:cover:https://home.cnblogs.com/u/dream-ze/【一】什么是装饰器装饰代指为被装饰对象添加新的功能,器代指器具/工具,装饰器与被装饰的对象均可......
  • 七、Harmony OS 之状态装饰器
    @State:@State装饰器的变量拥有其所属组件的状态,可以作为其子组件单向和双向同步的数据源。当其数值改变时,会引起相关组件的渲染刷新。@Prop:@Prop装饰的变量可以和父组件建立单向同步关系,@Prop装饰的变量二hi可变的,但修改不会同步回父组件。@Link:@Link装饰的变量和父组件构建双向......
  • 23种设计模式——装饰者模式
    今天给大家说一下23种设计模式中装饰者模式。一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。这个时候,我们就需要用到装饰者模式了,它可以实现在不增加很多子类的情况下扩展类的功能。概念:装饰者模式(DecoratorPatt......
  • 装饰器
    【一】函数的四种定义方式无参无返回值的函数defindex():res=1+1print(res)index()#2有参无返回值的函数defindex(x):print(x)index(1)#1有参有返回值defindex(x):returnxres=index(1)print(res)#1多个参数多个返回值......