Python进阶(六)----装饰器

Python进阶(六)----装饰器

一丶开放封闭原则

开放原则:

? 增加一些额外的新功能

封闭原则:

? 不改变源码.以及调用方式

二丶初识装饰器

装饰器:

? 也可称装饰器函数,诠释开放封闭原则,装饰器的本质是闭包

###普通版装饰器
import time
def timmer(x):                  # x 接收的原函数的内存地址
    def inner():
        start_time=time.time()
        x()                     # 执行 原函数
        print(f'执行效率{time.time()-start_time}')
    return inner                

def index():
    time.sleep(2)
    print(f'欢迎访问本站博客园')

index=timmer(index)         #将timmer函数执行的结果返回,付给index变量
index()                    #这里执行的inner函数

###标准版      @timmer是语法糖(黏贴在被装饰函数,先于执行被装饰函数),装饰器函数必写在被装饰函数之上.
import time
def timmer(func):       # 此时 func 就是一个自由变量
    def inner():
        start_time = time.time()
        func()          # func 是timmer函数传递过来的index原函数的内存地址
        print(f'执行效率 {time.time() - start_time}')
    return inner

@timmer                 # 等同于 index=timmer(index)  往下读一行
def  index():
    time.sleep(2)
    print('登录成功')

index()                #这里执行的inner函数

三丶被装饰器数带返回值

###需求被装饰函数有返回值

import time
def timmer(func):                 # 这里argv 接收的真正要执行的原函数.
    def inner():
        start_time=time.time()
        var=func()
        print(f'{time.time()-start_time},{args[0]},{args[1]}')

        return var          #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果
    return  inner           

@timmer
def index(*args,**kwargs):
    time.sleep(2)
    print('进入到网页index页面')
    return True                 # 原函数 最重返回的结果是 True

print(index(1,2))   # 这里是执行  inner方法

四丶被装饰函数带参数

###需求 被装饰函数有参数
import  time
def timmer(func):

    def inner(*args,**kwargs):        # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2)
        # 函数定义时 , * ,** 代表聚合

        start_time=time.time()

        res=func(*args,**kwargs)     # 执行真正的原函数, 将参数打散  func(1,2)
        # 函数执行时 ,* ,** 代表打散

        print(f'{time.time()-start_time} 这是{args[0]}')

        return res

    return inner

@timmer
def index(args):
    time.sleep(2)
    print(f'welcome {args}')
    return True

index('都来看')

五丶标准终终结版装饰器

######  装饰器原版   ####
def warpper(func):
    def inner(*args,**kwargs):
        '''被装饰器之前的操作'''
        ret=func(*args,**kwargs)
        '''被装饰函数之后的操作'''
        return ret
    return inner

####拓展版   计算index函数执行的效率

import  time
def timmer(func):

    def inner(*args,**kwargs):        # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2)
        # 函数定义时 , * ,** 代表聚合

        start_time=time.time()       

        res=func(*args,**kwargs)     # 执行真正的原函数, 将参数打散  func(1,2)
        # 函数执行时 ,* ,** 代表打散

        print(f'{time.time()-start_time}  这是{args[0]}')

        return res          #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果

    return inner            #返回inner函数, 给index重新赋值.

@timmer         #语法糖,等同于 index=timmer(index)  , 把index原函数作为形参传递给timmer函数func
def index(args):        # 原函数具有传参的功能
    time.sleep(2)
    print(f'welcome {args}')
    return True         # 原函数具有返回值的功能

index('都来看')            # 执行的是inner函数,把参数传递给inner函数,

####装饰器:
    #1.必须存在嵌套函数中
    #2.必须存在内存函数对外层函数(非全局变量)的引用
    #3.必须具有return 返回嵌套函数的内存地址(嵌套函数名字)
    #4.内层函数必须能够接收原函数传递的参数
    #5.内存函数执行完必须返回原函数要返回的结果

####装饰器约束:
    #1.不得更改源码,
    #2.不能更改调用方式

####应用场景:
    #用户登录验证
     #打印日志

原文地址:https://www.cnblogs.com/dengl/p/11077606.html

时间: 2024-09-30 10:49:09

Python进阶(六)----装饰器的相关文章

Python进阶之装饰器

函数也是对象 要理解Python装饰器,首先要明白在Python中,函数也是一种对象,因此可以把定义函数时的函数名看作是函数对象的一个引用.既然是引用,因此可以将函数赋值给一个变量,也可以把函数作为一个参数传递或返回.同时,函数体中也可以再定义函数. 装饰器本质 可以通过编写一个纯函数的例子来还原装饰器所要做的事. def decorator(func):          def wrap():         print("Doing someting before executing fu

[Python进阶]002.装饰器(1)

装饰器(1) 介绍 HelloWorld 需求 使用函数式编程 加入装饰器 解析 介绍 Python的装饰器叫Decorator,就是对一个模块做装饰. 作用: 为已存在的对象添加额外功能. 与Java中的注解相似,就是在方法前加@XXX来对这个方法做装饰. 与Java中的注解相当复杂不同,Python的装饰器相当简单. 函数式编程 面向切片编程 HelloWorld 需求 def fun(i): print i 这是一个简单的方法,现在我们要在执行这个方法前后在执行一些其他代码,比如计算运行时

python进阶:装饰器

1.闭包 简单理解:闭包就是多层函数的嵌套,外层函数的返回值是内层函数的引用. def out_func(n): num = 100 def in_fucn(*args,**kwargs): # nonlocal num if n % 2 == 0: # 里面没有修改num的值,直接使用可以,如果变成 num += n 则会报错,因此需要使用前加上nonlocal num return n + num # return num += n else: return n- num return in

六、PYTHON 学习之装饰器使用

Python是一种强大的语言,即可浅尝辄止,也可深入挖掘.很适合做科学计算.数据挖掘等等.今天我将简单介绍一下Python的装饰器(Decorators)的用法 . 假设我们想要庆祝下生日,需要邀请一些朋友过来参加.但是你有个讨厌的朋友,叫Joe,必须不能让他来啊.可能首先你想到的是建一个list,然后迭代查找并移除所有的Joe童鞋.这当然是个好方法,但是这里为了介绍装饰器,我们会用@来完成这个工作.虽然可能看起来没有什么必要,但是有助于大家学习装饰器的用法. 首先创建一个Python文件app

ZMAN的学习笔记之Python篇:装饰器

年前工作事务比较繁琐,我只能用零碎的时间继续学习Python,决定开一个系列的博文,作为自己深入学习Python的记录吧.名字也取好了,就叫<ZMAN的学习笔记之Python篇>~开篇是关于装饰器的,春节假期码的字哈哈~就让我们开始吧! 本文的例子都是自己想的,如果不是很合适,请大家提出宝贵意见哈~谢谢啦! 一.为什么要用“装饰器” 比如我们写了如下一段代码: # 打印0~99 def func(): for i in range(100): print(i) 我们想要监测执行这个函数花费了多

十、PYTHON 学习之装饰器加深理解

在第六章已经有所介绍,这里看到一篇比较好的文章转过来. 基本概念 装饰器是23z种设计模式之一,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理, Web权限校验, Cache等. 很有名的例子来理解,咖啡,加糖的咖啡,加牛奶的咖啡. 本质上,还是咖啡,只是在原有的东西上,做了"装饰",使之附加一些功能或特性. 例如记录日志,需要对某些函数进行记录 笨的办法,每个函数加入代码,如果代码变了,就悲催了 装饰器的办法,定义一个专门日志记录的装饰器,对需要的函数进行装饰.

python学习笔记--装饰器

1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来不这么单调: def showInfo(fun): def wrap(x,y): print "The function before" func(x,y) print "The function after" return wrap def f(x,y): print

1.16 Python基础知识 - 装饰器

Python中的装饰器就是函数,作用就是包装其他函数,为他们起到修饰作用.在不修改源代码的情况下,为这些函数额外添加一些功能,像日志记录,性能测试等.一个函数可以使用多个装饰器,产生的结果与装饰器的位置顺序有关. 装饰器基本形式: @装饰器1 def 函数1: 函数体 相当于:==> 函数1 = 装饰器1(函数1) 装饰器特点: 1.不修改源代码的调用方式 2.不修改源代码内容 3.装饰器有高阶函数与递归函数相融合的特点 多个装饰器修饰,示例: @foo @spam def bar():pass

python高级之装饰器

python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之一的函数就是高阶函数: 接受一个或多个函数作为输入参数 输出一个函数 首先理解一个概念:函数名其实也是一个变量,一个函数其实就是一个对象,函数名就是对这个对象的引用.所以函数名也就和一个普通变量一样可以被当做函数的变量进行传递,当然也能够把函数名当做一个变量进行返回. 举个栗子: 1 def foo