从零开始的Python学习Episode 11——装饰器

装饰器

装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象。

简单的装饰器

 1 import time
 2
 3 def show_time(f):
 4     def inner():
 5         start = time.time()
 6         f()
 7         end = time.time()
 8         print(‘time: %s‘%(end-start))
 9     return inner
10
11 @show_time
12 def fun1():
13     print(‘hello‘)
14     time.sleep(1)
15
16 fun1()#输出#hello#time: 1.000274896621704

其中@show_time的意思是 fun1 = showtime(fun1) ,作用是在执行原函数add()时,把执行的代码转为inner()函数中的代码。

带参数的被装饰函数

如果被装饰的函数带有参数则装饰函数要带上参数。

参数个数确定时:

 1 import time
 2
 3 def show_time(f):
 4     def inner(a,b):
 5         start = time.time()
 6         f(a,b)
 7         end = time.time()
 8         print(‘time: %s‘%(end-start))
 9     return inner
10
11 @show_time
12 def fun1(x,y):
13     print(x+y)
14     time.sleep(1)
15
16 fun1(1,2)#输出#3#time: 1.0007870197296143

参数个数不确定时:

 1 import time
 2
 3 def show_time(f):
 4     def inner(*args,**kwargs):
 5         start = time.time()
 6         f(*args,**kwargs)
 7         end = time.time()
 8         print(‘time: %s‘%(end-start))
 9     return inner
10
11 @show_time
12 def fun1(*args,**kwargs):
13     sum = 0
14     for i in args:
15         sum+=i
16     print(sum)
17     time.sleep(1)
18
19 fun1(1,2,3,4,5)#输出#15#time: 1.0009024143218994

带参数的装饰器

import time
def judge(flag = ‘False‘):
    def show_time(f):
        def inner(*args,**kwargs):
            if flag == ‘True‘:
                start = time.time()
                f(*args,**kwargs)
                end = time.time()
                print(‘time: %s‘%(end-start))
            else:
                f(*args, **kwargs)
        return inner
    return show_time

@judge(‘True‘)
def add(*args,**kwargs):
    sum = 0
    for i in args:
        sum+=i
    print(sum)
    time.sleep(1)

@judge()
def multiple(*args,**kwargs):
    sum = args[0]
    for i in args:
        sum*=i
    print(sum)
    time.sleep(1)

add(1,2,3,4,5)
multiple(1,2,3,4,5)#输出#15#time: 1.0006871223449707#120

装饰器的语法允许我们在调用时,提供其它参数,比如当@judge()参数为默认的False时,不输出消耗时间了,当@judge()参数为True时,输出了消耗时间。这样实际上是在原有的装饰器上再加了一层,当我 们使用@judge(‘True’)调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。

原文地址:https://www.cnblogs.com/smilepup-hhr/p/9756438.html

时间: 2024-11-17 08:01:44

从零开始的Python学习Episode 11——装饰器的相关文章

Python学习之路-装饰器&生成器&正则表达式

装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(func):     def inner():         if USER_TEMP["status"] == False:             print("\033[31;1m用户未登录,请先登录\033[0m")             login_atm()

python学习笔记(五):装饰器、生成器、内置函数、json

这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面每个函数都加一个功能,用来统计每个函数的运行时间是多少,找出来运行比较慢的函数,来优化代码,就需要添加一个新的功能,来统计程序的运行时间,那这样的话,就得修改每个函数了,需要改代码,但是代码特别多,改完了公司倒闭了,这时候装饰

python学习笔记:装饰器2

python的装饰器本质是函数,为了不改变装饰目标函数内部代码而增加额外功能而存在 直接举例: import datetime def func_name(func):#定义一个装饰函数,接受一个函数对象作为参数(也就是被装饰的函数) def wrap():#包装函数 print("Function name:%s"%(func.__name__)) func() #执行目标函数 return wrap #返回包装函数 @func_name #等于 func_time = func_n

Python学习笔记012——装饰器

1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函数,函数装饰类,类装饰函数,类装饰类(两者不是一一对应关系,其实我也不知道他们之间是什么样的对应关系) 一般而言,主要应用的是函数装饰函数 1.3 装饰器本质 本质上,decorator就是一个返回函数的高阶函数. 在面向对象(OOP)的设计模式中,decorator被称为装饰模式.OOP

python学习笔记之装饰器(语法糖)

什么是装饰器 装饰器的知识点铺垫(函数即变量,高阶函数,嵌套函数) 不带参数的装饰器示例 带参数的装饰器示例 作业 一.什么是装饰器 本质上,装饰器就是返回一个函数的高阶函数.装饰器就是一个函数 装饰器的原则: 不修改被装饰对象的源代码 不修改被装饰对象的调用方式 二.装饰器涉及的知识点 函数即变量 高阶函数 嵌套函数 函数即变量: 在python中,一个变量首先被定义,分配内存空间,然后再使用. 以x=1,这个简单的赋值语句为例子.首先在内存中分配一个空间,x指向该内存空间,该内存空间内存入"

python学习笔记之——装饰器及对象

1.反射之__import__ 我们知道import语句是用来导入外部模块的,当然还有from...import...也可以,但是其实import实际上是使用builtin函数__import__来工作的.        在一些程序中,我们可以动态地去调用函数,如果我们知道模块的名称(字符串)的时候,我们可以很方便的使用动态调用. __import__(module_name[, globals[, locals[, fromlist]]]) #可选参数默认为globals(),locals()

从零开始的Python学习Episode 7——文件基本操作

文件基本操作 一.打开文件 f = open('11','r')#open('file path','mode') 创建一个文件对象 文件有多种打开模式: 1. 'r':新建一个文件对象以只读方式打开文件.读文件的指针将会放在文件的开头. f = open('11','r')#open('file path',mode') data = f.read() print(data)f.close() #输出123456789 2.'w':新建一个只用于写文件的文件对象 f = open('11','

从零开始的Python学习Episode 10——函数

函数 一.函数的创建 简单格式 def function_name(参数表): 函数体 return 如果没有写return,函数会默认返回一个none 二.函数的参数 必需参数: 调用函数时必需参数须以正确的顺序传入,调用的数量必须和声明时的一样. def func1(name,age): print('my name is %s,i am %d years old'%(name,age)) func1('smilepup',20) #输出my name is smilepup,i am 20

从零开始的Python学习Episode 12——迭代器&生成器

生成器 列表生成式 用于快速地生成一个列表 a = [x*x for x in range(1,9)] print(a) #输出[1, 4, 9, 16, 25, 36, 49, 64] 也可以用于生成函数结果的列表 def f(n): return n**3 a = [f(x) for x in range(1,9)] print(a) #输出[1, 8, 27, 64, 125, 216, 343, 512] 迭代器 迭代器是一个带状态的对象,他能在你调用 next() 方法的时候返回容器中