python 之 函数 装饰器

5.8 装饰器

1 开放封闭原则 软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的 也就是说我们必须找到一种解决方案: 能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能 原则如下: 1、不修改源代码 2、不修改调用方式 目的: 在遵循1和2原则的基础上扩展新功能

装饰器: 装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能,装饰器与被装饰的对象均可以是任意可调用的对象

装饰器 ===》函数 被装饰的对象 ===》函数

5.81 无参装饰器举例

import timedef index():    time.sleep(3)    print(‘welcome to index page‘)def outter(func): #func=最原始的index    def wrapper():        start_time=time.time()        func()        stop_time=time.time()        print(stop_time-start_time)    return wrapper?index=outter(index)     # 新的index=wrapperindex()                #wrapper()
welcome to index page3.0000429153442383

5.82 无参装饰器升级

import timedef index():    time.sleep(1)    print(‘welcome to index page‘)    return 122def home(name):    time.sleep(2)    print(‘welcome %s to home page‘ %name)#==============装饰器def timmer(func):               #func=最原始的index    def wrapper(*args,**kwargs):        start_time=time.time()        res=func(*args,**kwargs) #调用最原始的index        stop_time=time.time()        print(stop_time-start_time)        return res    return wrapper?index=timmer(index) # 新的index=wrapperhome=timmer(home) #新的home=wrapper# ==========================================?res=index()             #res=wrapper()print(res)res=home(name=‘egon‘)   #res=wrapper(name=‘egon‘)print(res)

5.83 无参装饰器模板:

def index():    pass#==============装饰器def outer(func):    def inner(*args,**kwargs):        res=func(*args,**kwargs)        return res    return inner?index=outer(index)  # ==========================================res=index()             print(res)

使用:在被装饰对象正上方单独一行,@无参装饰器名

@无参装饰器名def foo():    pass

5.84 装饰器语法糖

import timedef timmer(func):    def wrapper(*args,**kwargs):        start_time=time.time()        res=func(*args,**kwargs)        stop_time=time.time()        print(stop_time-start_time)        return res    return wrapper?@timmer              #index=timmer(index)def index():    time.sleep(1)    print(‘welcome to index page‘)    return 122?@timmer             # home=timmer(home)def home(name):    time.sleep(2)    print(‘welcome %s to home page‘ %name)?index()home(‘egon‘)

5.85 叠加装饰器

import timecurrent_user={    ‘username‘:None,}?def auth(func):      # func=index    def wrapper(*args,**kwargs):        if current_user[‘username‘]:            print(‘已经登陆过了‘)            res=func(*args,**kwargs)            return res        uname=input(‘用户名>>: ‘).strip()        pwd=input(‘密码>>: ‘).strip()        if uname == ‘egon‘ and pwd == ‘123‘:            print(‘登陆成功‘)            current_user[‘username‘]=uname            res=func(*args,**kwargs)            return res        else:            print(‘用户名或密码错误‘)    return wrapper?def timmer(func):    def wrapper(*args,**kwargs):        start_time=time.time()        res=func(*args,**kwargs)        stop_time=time.time()        print(stop_time-start_time)        return res    return wrapper?@timmer # timmer 统计的是auth+index的执行时间@authdef index():    time.sleep(1)    print(‘welcome to index page‘)    return 122?index()

5.86 有参装饰器

import timecurrent_user={    ‘username‘:None}def auth(engine):        # engine=‘file‘    #添加一层函数传engine值    def auth2(func):     # func=index        def wrapper(*args,**kwargs):            if engine == ‘file‘:                if current_user[‘username‘]:                    print(‘已经登陆过了‘)                    res=func(*args,**kwargs)                    return res                uname=input(‘用户名>>: ‘).strip()                pwd=input(‘密码>>: ‘).strip()                if uname == ‘egon‘ and pwd == ‘123‘:                    print(‘登陆成功‘)                    current_user[‘username‘]=uname                    res=func(*args,**kwargs)                    return res                else:                    print(‘用户名或密码错误‘)            elif engine == ‘mysql‘:                print(‘基于MyQL的认证‘)            elif engine == ‘ldap‘:                print(‘基于LDAP的认证‘)        return wrapper    return auth2#auth_src=auth(‘ldap‘)#@auth_src?@auth(‘ldap‘)       # @auth2 #index=auth2(index) #index=wrapperdef index():    time.sleep(1)    print(‘welcome to index page‘)    return 122?index()             # wrapper()

5.87 有参装饰器模板

def outter2(x,y,z):    def outter(func):        def wrapper(*args,**kwargs):            res=func(*args,**kwargs)            return res        return wrapper    return outter@outer2(1,2,3)# ==========================================def index():    passres=index()             print(res)

使用:在被装饰对象正上方单独一行,@有参装饰器名(1,2,3)

@有参装饰器名(1,2,3)def foo():    pass

原文地址:https://www.cnblogs.com/mylu/p/11006349.html

时间: 2024-08-02 23:53:56

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

python之函数装饰器

今日内容总结:装饰器(闭包函数的一种应用)无参装饰器有参装饰器 装饰器(闭包函数的一种应用) 1. 什么是装饰器器:指的是具备某一功能的工具装饰:指的是为被装饰器对象添加新功能 装饰器就是用来为被装饰器对象添加新功能的工具 需要注意的是:装饰器本身可以是任意可调用对象,被装饰器的对象也可以是任意可调用对象 2. 为何要用装饰器因为在实际开发环境中,是不允许对原代码进行操作,而且不能破坏原有的调用关系,根据实际要求还需要增添新功能开发需要遵循的一个原则开放封闭原则:封闭指的是对修改封闭,对扩展开放

Python Day4 函数 装饰器

内置函数: 参考 https://docs.python.org/2/library/functions.html 装饰器 装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作 # 定义函数,为调用,函数内部不执行 # 函数名 > 代指函数 # @ + 函数名 # 功能: #     1. 自动执行outer函数并且将其下面的函数名f1当作参数传递 #     2. 将outer函数的返回值,重复赋值给 f1 example 1:

python 匿名函数&装饰器

匿名函数 关键字lambda表示匿名函数,冒号前面的x表示函数参数匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果. >>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))[1, 4, 9, 16, 25, 36, 49, 64, 81] 可以把匿名函数赋值给一个变量,再利用变量来调用该函数:>>> f = lambda x: x * x>>> f<

Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

python函数装饰器

学习装饰器前提需要了解高阶函数,函数嵌套,函数闭包 python函数装饰器,顾名思义就是装饰函数,为函数添加新功能的的一种方式. 为什么要使用装饰器呢? 因为函数在运行时,如果不使用装饰器对函数进行功能添加,需要修改函数源代码,这样修改无疑会增加程序的冗余和复杂性,也不便于程序员对其进行修改.使用装饰器,可以在不改变函数源代码和调用方式的前提下,使用语法糖@装饰器,对函数功能进行添加. 装饰器本质上就是一个函数. 我们使用一个简单的例子来实现: import time #这是一个装饰器函数名为t

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 函数装饰器入门

原文链接: --> A guide to Python's function decorators Python功能强劲,语法表现力强,尤其装饰器深深的吸引着我.在设计模式中,装饰器可以在不使用子类的情况下,动态的改变函数,方法以及类的功能.这个功能非常有用,特别在你想扩展函数的功能同时又不想改变原有的函数.的确,我们任意的实现装饰器设计模式,但是,python通过提供简单的语法和特性让装饰器的实现变的如此简单. 在本文中,我将用一组例子来深入浅入python 函数装饰器的功能,所有的例子都是在

【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

Python高阶函数与函数装饰器-day4

上节回顾 高阶函数 闭包函数 函数装饰器 模块导入 一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首先是Python3-->代码文件都是用utf-8来解释的.将代码和文件读到内存中就变成了Unicode,这也就是为什么Python只有encode没有decode了,因为内存中都将字符编码变成了Unicode,而Unicode是万国码,可以"