装饰器基础

1.示例

import time
print(time.time())  #1559635927.77328...从
time.sleep(5)     #让程序在执行到此位置停n秒
print(‘aaa‘)

2.在这个基础上,我们写一个函数

def func():            #计算函数执行时间(合并)
    start=time.time()
    list1=[1,2,3,4,5]
    s=int(input("请输入一个值:"))
    list1.append(s)
    for i in list1:
        print(i,end=‘   ‘)
    print(‘\n‘)
    end=time.time()
    print(end-start)

func()

3.分开

def time1(f):                 #将计算函数执行时间的函数独立出来
    startx=time.time()
    f()
    endx=time.time()
    print(endx-startx)

def func1():
    list1 = [1, 2, 3, 4, 5]
    s = int(input("请输入一个值:"))
    list1.append(s)
    for i in list1:
        print(i, end=‘   ‘)
    print(‘\n‘)

time1(func1)

4.修饰

#用作对比def time1(f):                 #将计算函数执行时间的函数独立出来
    startx=time.time()
    f()
    endx=time.time()
    print(endx-startx)

def func1():
    list1 = [1, 2, 3, 4, 5]
    s = int(input("请输入一个值:"))
    list1.append(s)
    for i in list1:
        print(i, end=‘   ‘)
    print(‘\n‘)

time1(func1)
#希望使用func1(),不希望调用时使用time1()#time2就是一个装饰器函数,只是对一个函数有一些装饰作用#time2:装饰器函数      func2:被装饰的函数def func2():    list1 = [1, 2, 3, 4, 5]    s = int(input("请输入一个值:"))    list1.append(s)    for i in list1:        print(i, end=‘   ‘)    print(‘\n‘)

def time2(f):              #传入的实际上是func1函数的内存地址    def inner():        startx = time.time()        f()        endx = time.time()        print(endx - startx)    return inner           #返回的都不用加括号,就那个名字已经是函数的地址

func2=time2(func2)         #使用闭包func2()

5.语法糖[email protected]装饰器名---

def time2(f):              #传入的实际上是func1函数的内存地址
    def inner():
        startx = time.time()
        f()
        endx = time.time()
        print(endx - startx)
    return inner           #返回的都不用加括号,就那个名字已经是函数的地址
@time2                     #必须先定义time2(这里要紧贴被修饰的函数)作用相当于func2=time2(func2)
def func2():
    list1 = [1, 2, 3, 4, 5]
    s = int(input("请输入一个值:"))
    list1.append(s)
    for i in list1:
        print(i, end=‘   ‘)
    print(‘\n‘)

func2()

6.如果被修饰的函数有返回值

def time2(f):     #传入的实际上是func1函数的内存地址
    def inner():
        startx = time.time()
        ret=f()
        endx = time.time()
        print(endx - startx)
        return ret
    return inner
@time2
def func2():
    list1 = [1, 2, 3, 4, 5]
    s = int(input("请输入一个值:"))
    list1.append(s)
    for i in list1:
        print(i, end=‘   ‘)
    print(‘\n‘)
    return list1
#func2=time2(func2)  #使用闭包

ret=func2()
print(ret)

7.被装饰的函数带参数

#被装饰的函数有参数
import time
def time2(f):     #传入的实际上是func1函数的内存地址
    def inner(a):
        startx = time.time()
        ret=f(a)
        endx = time.time()
        print(endx - startx)
        return ret
    return inner
@time2
def func2(a):
    print(a)
    list1 = [1, 2, 3, 4, 5]
    s = int(input("请输入一个值:"))
    list1.append(s)
    for i in list1:
        print(i, end=‘   ‘)
    print(‘\n‘)
    return list1
#func2=time2(func2)  #使用闭包

a=‘开始:‘
ret=func2(a)
print(ret)

8.多个参数都被装饰,且传入的参数个数不一致

#多个被装饰的函数传入不同个参数
def time2(f):     #传入的实际上是func1函数的内存地址
    def inner(*args,**kwargs):      #完美的装饰器,万能参数都可以,加入后面有被修饰的函数
        startx = time.time()
        ret=f(*args)
        endx = time.time()
        print(endx - startx)
        return ret
    return inner
@time2
def func2(a):
   pass
@time2
def func3(a,b):
   pass
func2(1)
func3(2,b=4)   #只用*args是顶不住的,所以加*kwargs

9.总结

def wrapper(f):                  #装饰器的固定模式。
    def inner(*args,**kwargs):
        #在装饰之前要做的事
        ret=f(*args,**kwargs)
        #在装饰之前要做的事
        return ret
    return inner
#wrapper是装饰器的一般起名
#参数f是被装饰的函数
#定义一个新的内部函数,后面一定返回这个内部函数@wrapperdef f():    pass

10.开放封闭原则

#开放封闭原则
#1.开发:对扩展是开放的
#2.封闭:对修改是封闭的(封版)
#函数重构一般不会轻易进行
#在已经写好的函数中,绝对不会再修改(除非已经到了一定要重构的地步)
#装饰器就可以不修改原来的函数,也修改了函数的功能

原文地址:https://www.cnblogs.com/lowislucifer/p/10974785.html

时间: 2024-10-13 21:32:51

装饰器基础的相关文章

Python开发基础-Day7-闭包函数和装饰器基础

补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其他局部作用域中使用全局变量,声明后可以在其他作用于中修改和使用 x=1 #全局赋值变量 def foo(): global x #函数内部全局声明变量x x=1111111 #函数内部修改全局变量x print(x) foo() print(x) global声明的变量在任何作用域都能够修改,所以一般非必要情

Python——装饰器基础

装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自己编写新的装饰器的更多高级语法. ================================================================================= 什么是装饰器 装饰是为函数和类指定管理代码的一种方式.Python装饰器以两种形式呈现: [1]函数装饰器在函数定义的时候进行名称重绑定,提供一个逻辑层来管理函数和方法或随后对它们的调

python学习系列之python装饰器基础(2)---装饰含返回值的函数

在上篇基础(1)中,我写了一个装饰器及使用方法,但是如果遇到一个函数带返回值的话,就不好使了,因此重写一个装饰器如下: #basic2.py #coding:utf-8 def auth(func):     def inner(*arg, **kwargs):         print 'before'         temp = func(*arg,**kwargs) #这行是关键,func相当于fetch_server_list         print 'after'       

python学习系列之python装饰器基础(1)

创建装饰器 # basic.py #首先定义一个装饰器auth: #一般装饰器 def auth(func):     def inner():         print 'before'         func()         print 'after'     return inner #带1个参数的装饰器 def auth_arg(func):     def inner(arg):         print 'before'         func(arg)         

python学习系列之python装饰器基础(5)---多装饰器的使用

有些时候,可能实际工作中需要同时使用多个装饰器,具体怎么用,见代码: #basic5.py def auth1(func):     def inner():         print 'before 1'         func()         print 'after 1'     return inner def auth2(func):     def inner():         print 'before 2'         func()         print '

python学习系列之python装饰器基础(6)---装饰器加参数

一.常规的装饰器,比如 @auth,执行2步操作: 1.执行auth函数,并传参func进来 2.获取返回值,并赋值给被装饰器的函数的函数名(如让fetch_server_list等于返回值) 二.而带参数的装饰器,比如 @auth(before,after),则执行3步操作: 1.执行auth(before,after)这个函数,得到返回值ret(假设返回值为ret) 2.创建装饰器,获取返回值,拼接为@ret 3.相当于@auth函数的2个步骤: 1)执行ret函数 2)将ret函数的返回值

四 .Flask 模板 中间件 特殊装饰器 基础知识(使用)

一 Flask 模板 中间件 特殊装饰器 1 .Flask 模板语法直接看面效果 https://www.cnblogs.com/lovershowtime/p/11349576.html    模板  和Django模板类似 edit.html<form> asdfasdf asdfasdf asdf asdf 哈啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 </form> login.html <!DOCTYPE html> <html lang="zh-C

Python 函数装饰器和闭包

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 25.0px Helvetica } 装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica } 假如有个名为 decorate 的装饰器: @decorate def targ

[译]Python之装饰器知必会

装饰器基础 Python的函数是对象 为了理解装饰器, 你必须先理解: 在Python的世界, 函数是对象. 这一点很重要. 让我们通过一个简单的例子来看看为什么: def shout(word="yes"): return word.capitalize()+"!" print shout() # 输出 : 'Yes!' # 作为一个对象, 你可以像任何其他对象一样, 将函数赋值给一个变量 scream = shout # 注意, 我们并没有使用括号: # 我们没