python之路--装饰器函数

(一)装饰器的形成过程

装饰器的本质是闭包函数的一种应用,装饰器是用来装饰函数的,在不修改原函数及其调用方式的情况下对原函数功能进行拓展。

#简单的无参函数装饰器
import time
def timmer(func):
    def inner():
        start = time.time()
        func()
        end = time.time()
        print(end -start)
    return inner
@timmer#语法糖
def hahaha():
    time.sleep(2)#停止时间的一种用法
    print("a")
hahaha()
#简单的有参函数装饰器
import time
def timmer(func):
    def inner(x,y):
        start = time.time()
        func(x,y)
        end = time.time()
        print(end -start)
    return inner
@timmer
def hahaha(a,b):
    time.sleep(2)#停止时间的一种用法
    print("aaa")
hahaha(1,2)
#简单的带返回值的装饰器
import time
def timmer(func):
    def inner(*args,**kwargs):
        start = time.time()
        se = func(*args,**kwargs)
        end = time.time()
        print(end - start)
        return se
    return inner
@timmer
def func2(a):
     print("in func and get a:%s"%(a))
     return "fun2 over"
func2([1,2,3,4,5])

装饰器的主要功能和装饰器的固定结构

装饰器的主要功能:

在不改变原函数及其调用方式的基础上在函数的前,后增加功能。

装饰器的固定格式:

#完美的装饰器格式
def wrapper(func):
    def inner(*args,**kwargs):
        ‘‘‘执行之前要做的‘‘‘
        re = func(*args,**kwargs)
        ‘‘‘执行函数之后要做的‘‘‘
        return re
    return inner

带参数的装饰器

#装饰器多层嵌套
def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print("执行函数前要做的")
            re = func(*args,**kwargs)
            if flag:
                print("执行函数后要做的")
            return re
        return inner
    return timer
@outer("hello world")#装饰器也可传参
def func(a,b):
    print(111)
func(1,3)

开放封闭原则

1,对扩展是开放的,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何修改。所以我们必须允许代码扩展,添加新功能。

2,对修改是封闭的,我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其修改了,很有可能影响其他已经在使用该函数的用户。

装饰器完美遵循了这个开放封闭的原则。

多个装饰器装饰同一个函数

def wrapper1(func):
    def inner():
        print("wrapper1,before func")
        func()
        print("wrapper1,after func")
    return inner
def wrapper2(func):
    def inner():
        print("wrapper2 ,before func")
        func()
        print("wrapper2,before func")
    return inner
@wrapper1
@wrapper2
def f():
    print("in f")
f()
时间: 2024-11-01 06:17:47

python之路--装饰器函数的相关文章

Python之路-装饰器

一.装饰器前置知识要点 1.名称空间 存放名字与变量绑定关系的地方 名称空间的分类: 内置名称空间:Python解释器启动时,存放自带的名字的地方.(比如内置函数) 全局名称空间:在执行文件时,文件级别名字存放的地方 局部名称空间:在执行文件过程中,如果调用函数,用来存放函数内定名称的地方,调用时生效,调用结束后失效 加载顺序:内置-------->全局---------->局部 查找顺序:局部-------->全局---------->内置 2.作用域 作用域:作用的范围 (1)

python之路——装饰器

作为一个会写函数的python开发,我们从今天开始要去公司上班了.写了一个函数,就交给其他开发用了. def func1(): print('in func1') 季度末,公司的领导要给大家发绩效奖金了,就提议对这段日子所有人开发的成果进行审核,审核的标准是什么呢?就是统计每个函数的执行时间. 这个时候你要怎么做呀? 你一想,这好办,把函数一改: import time def func1(): start = time.time() print('in func1') print(time.t

Python(73)_装饰器函数练习_执行函数前登录验证

#-*-coding:utf-8-*- import os import time from functools import wraps ''' 1.编写装饰器,为多个函数加上认证的功能(用户的账号和密码来源于文件) 2.要求登录一次,后续函数都无需输入用户名和密码 ''' FLAG = False def login(func): def inner(*args,**kwargs): global FLAG ''' 登录程序 ''' if FLAG: ret = func(*args, **

python学习-42 装饰器 --- 函数闭包1

函数闭包举例: def father(name): print('hello world') def son(): print('儿子说:我的爸爸是%s' % name) def grandfson(): print('孙子说:我的爷爷是%s' % name) grandfson() son() father('小明') 运行结果: hello world 儿子说:我的爸爸是小明 孙子说:我的爷爷是小明 Process finished with exit code 0 函数的包: 就是嵌套里的

百万年薪python之路 -- 装饰器

装饰器 1.1 开放封闭原则 开放封闭原则具体定义是这样: 1.对扩展是开放的 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封闭的 因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对函数内部进行修改,或者修改了函数的调用方式,很有可能影响其他已经在使用该函数的用户. 定义:在不改变原被装饰的函数的源代码以及调用方式下,为其添加额外的功能. 实现真正的开放封闭原则:装饰器. 运用闭

python学习-43 装饰器 -- 函数闭包2

函数闭包为函数加上认证功能 1.登陆账号 user_dic ={'username':None,'login':False} def auth_func(func): def wrapper(*args,**kwargs): if user_dic['username'] and user_dic['login']: res = func(*args,**kwargs) return res username = input('账号:').strip() passwd = input('密码:'

python学习——装饰器函数

一.装饰器函数的作用是什么 答:装饰器函数是在不修改原函数及其调用方式的情况下对原函数功能进行扩展 对于搞python开发的人来说,函数占据了至关重要的地位.都说学好函数你就可以去找工作了,好了,假如你已经在某个公司上班了,想到马上就要过年了,那过年就意味着你可以向老板要年终奖金了,那凭什么老板要给你年终奖呢,你又能得到多少年终奖金呢.老板是这样说的,你给我至少写1000行代码,我来看一下你代码的执行时间,根据你的执行时间来评你的年终奖.好了,你知道既然要计算时间,学过函数的你就来实现一个计算函

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

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

Python自学之路——装饰器的秘密

先不管装饰器到底是个什么东东,让我们来聊一聊函数的几个点吧.我们知道,在python里,一切皆是对象,那么函数呢,当然也是对象,而且人家还是一级对象呐.既然是对象,那它就可以被赋值给变量,反之,通过变量也能调用函数.好,需特别注意的点来了,函数调用一定是函数名 + (),如果没有这个括号,函数是不会被调用的,它只能是表示内存里的一个地址,看下面 1 def happy(): 2 print('be happy') 3 print (happy) #并没有调用happy函数,只是打印了happy的