首页 > 其他分享 >装饰器

装饰器

时间:2023-05-14 23:22:27浏览次数:27  
标签:outer 函数 result func 装饰 def

装饰器(Decorator)的作用是可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出。

装饰器有很多种,有函数的装饰器,也有类的装饰器。

体现设计模式中的装饰模式,强调开放封闭原则(已经实现的功能代码内部不允许被修改,但外部可以被扩展)

最基本的结构:

def outer(func):
    def inner():
        print('认证成功')
        result = func()
        print('日志添加成功')
        return result
    return inner


@outer
def f1():
    print('业务部门1数据接口……')

如上述代码中所示,程序读到@outer时会执行以下步骤:1、将被装饰的函数的名字作为参数传递给装饰器函数;2、装饰器执行其函数内的代码,将返回值赋给被装饰的函数(被装饰的函数名指向新的返回对象)

装饰器内为啥有时会封装一层函数:因为@outer这句代码在程序执行到这里的时候会自动执行outer函数内部的代码,如果不封装就会直接执行,可能会与初衷不符。

被装饰函数的有入参,该如何传递?

样例代码:

def outer(func):
    def inner(username):
        print("认证成功!")
        result = func(username)
        print("日志添加成功")
        return result
    return inner

@outer
def f1(name):
    print("%s 正在连接业务部门1数据接口......"%name)

# 调用方法
f1("jack")

另外注意事项:

1、一个函数可以被多个装饰器装饰。

2、装饰器也可以有自己的参数,样例代码:

# 认证函数
def  auth(request,kargs):
    print("认证成功!")
# 日志函数
def log(request,kargs):
    print("日志添加成功")

# 装饰器函数。接收两个参数,这两个参数应该是某个函数的名字。
def Filter(auth_func,log_func):
    # 第一层封装,f1函数实际上被传递给了main_fuc这个参数
    def outer(main_func):
        # 第二层封装,auth和log函数的参数值被传递到了这里
        def wrapper(request,kargs):
            # 下面代码的判断逻辑不重要,重要的是参数的引用和返回值
            before_result = auth_func(request,kargs)
            if(before_result != None):
                return before_result

            main_result = main_func(request,kargs)
            if(main_result != None):
                return main_result

            after_result = log_func(request,kargs)
            if(after_result != None):
                return after_result

        return wrapper
    return outer
# 注意了,这里的装饰器函数有参数哦,它的意思是先执行filter函数
# 然后将filter函数的返回值作为装饰器函数的名字返回到这里,所以,
# 其实这里,Filter(auth,log) = outer , @Filter(auth,log) =  @outer
@Filter(auth,log)
def f1(name,age):

    print("%s 正在连接业务部门1数据接口......"%name)

# 调用方法
f1("jack",18)

# 运行结果
# 认证成功!
# jack
# 正在连接业务部门1数据接口...... 日志添加成功

 

标签:outer,函数,result,func,装饰,def
From: https://www.cnblogs.com/freecheng/p/17400536.html

相关文章

  • 装饰器
    1.装饰器模板: 2.登录认证装饰器: ......
  • 面向对象,面向对象的3个装饰器
    面向对象-断浪狂刀忆年少-博客园(cnblogs.com)通过函数实现面向对象编程面向对象的思维内涵只关心程序中有多少角色每个角色有什么方法,有什么属性所有角色都是由一个模板创建的所有属性和技能都待在自己的角色模板中--------可读性好能够更加方便得为角色添......
  • csrf跨站请求伪造、csrf相关装饰器、auth认证模块
    csrf跨站请求伪造、csrf相关装饰器、auth认证模块csrf跨站请求伪造简单来说就是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作,用于浏览器曾经认证过,所以被访问的网站会以为是真正的用户操作而去执行。经典例子钓鱼网站:假设是一个跟银......
  • 入门8-Pytest.mark装饰器设置用例分组执行
    与全局配置pytest.ini配置文件结合使用(见配置文件章节)例如 配置文件中设置markers=#分成三类High/Normal,Low  High:smoketest  Normal:producttest  Low:fulltestcases分模块执行:-         Case中加装饰器@pytest.mark.High-     ......
  • C#设计模式07——装饰器模式的写法
    装饰器模式是一种结构型设计模式,可以在不修改原始对象的基础上添加新的功能和行为。该模式通过将对象包装在具有相同接口的装饰器类中来实现此目的。以下是5W1H分析:What(什么)?装饰器模式是一种结构型设计模式,它允许在运行时动态地向对象添加新的功能和行为,而无需修改原始对象的代......
  • csrf跨站请求伪造,相关校验,装饰器
    csrf跨站请求伪造钓鱼网站:模仿一个正规的网站让用户在该网站上做操作但是操作的结果会影响到用户正常的网站账户但是其中有一些猫腻 eg:英语四六级考试需要网上先缴费但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户并不是真正的四六级官方账户模拟钓......
  • Python的魔术方法,装饰器和属性
    这里将介绍python的所谓魔法方法以及装饰器魔术方法一般在类中以双下划线包围的方法就是魔术方法,或者叫特殊方法。简单来说,Python的魔术方法是为了利用Python的标准方法以及不用去记住标准操作的名称,实现更统一的接口。例如下面的代码importcollectionsCard=collection......
  • Cookie与Session CBV中加装饰器
    目录一.会话跟踪技术什么是会话跟踪?我们需要先了解一下什么是会话。可以把会话理解为客户端和服务端之间的一次会晤,在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话,你就是客户端,而10086就是服务端。从双方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话......
  • python 装饰器
    装饰器(Decorator)是Python语言中的一种高级技巧,可以在不改变原有代码的基础上,动态地给函数或类增加额外的功能。本质上,装饰器就是一个普通函数,它可以接受一个或多个参数,并且返回一个函数作为结果。装饰器的语法如下:@decorator_functiondeffunction_to_be_decorated():#F......
  • 十四:装饰器模式:个性的华丽外衣
    a.装饰器模式的精髓装饰器模式是一种结构型设计模式,允许我们在不改变现有对象结构的情况下,动态地为对象添加新的功能。它提供了比继承更灵活的方式来扩展对象功能,遵循开闭原则。装饰器模式的核心思想是:将一个对象嵌入另一个具有相同接口的对象(装饰器)中,然后通过装饰器调用原对象......