python3之装饰器

1、装饰器

装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限验证等场景,装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

装饰器的实现原理:

#无参数装饰器原理:
def login(funct):
    print(‘passed user veriftcation...‘)
    return funct   #函数返回形参的值或内存地址

def tv():
    print(‘welcom  to TV page‘)
tvv= login(tv)   #执行login函数,参数tv返回tv函数的内存地址
tvv()  #执行生成器函数将执行tv函数

传参数装饰器原理:

#实例:实现程序执行前的验证
def login(funct):   #验证函数
    def inner(arg):  #嵌套函数是为了不让验证函数不执行
        print(‘passed user veriftcation...‘)
        funct(arg)
    return inner    #将内嵌函数内存地址返回给login

@login     #@是装饰器的语法糖,它实际就是等于tv=login(tv)
def tv(name):   #执行程序函数
    print(‘welcom %s to TV page‘ %name)

#tv = login(tv)    #相当与@login,与装饰器的作用一样
tv(‘zhang‘)    #执行程序前,通过装饰器验证

#上面程序执行原理说明:
#程序执行后,首先扫描程序内的装饰器(@login)执行后,跳转到装饰器函数
#将函数读取到内存,login将返回inner函数的内存地址,执行tv时,首先执行inner函数,tv参数‘zhang’传递给inner,打印输出,funct参数值为tv,执行funct后就会执行tv函数。理解装饰器原理就是把tv函数包起来执行,先验证后执行。

装饰器下的函数返回值:

def login(funct):
    def inner(*args,**kwargs):
        print(‘passed user veriftcation...‘)
        return funct(*args,**kwargs)   #inner的返回值就是tv的返回值
    return inner

#@login
def tv(*args,**kwargs):
    print(‘welcom %s to TV page %s‘ %(args,kwargs))
    return 88    #返回值
tv = login(tv)
dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘}
li = [‘python‘,‘java‘]
t = tv(dic,li)
print(t)

装饰器带传参函数,多层装饰器:

#验证函数
def login(*args,**kwargs):
    print(‘%s登陆验证%s!‘%(args,kwargs))
#登陆后操作
def quanxian(*args,**kwargs):
    print(‘%s登陆后操作!%s‘%(args,kwargs))
#装饰器
def decorator(login_func,quanxian_func): #传参2个函数
    def inner(index_func):   #传参登陆函数
        def inner2(*args,**kwargs):  #接收index的传参
            login_func(*args,**kwargs)  #执行login函数
            index_func(*args,**kwargs)  #执行index函数
            quanxian_func(*args,**kwargs)  #执行quanxian函数
        return inner2   #返回函数地址
    return inner  #返回函数地址
@decorator(login,quanxian)  #执行装饰器
def index(*args,**kwargs):  #登陆函数
    print(‘登陆后台!%s,%s‘%(args,kwargs))
l1 = [1,2,3,4]
dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘}
index(l1,dic)    #执行函数
时间: 2024-10-08 23:06:28

python3之装饰器的相关文章

Python3.5:装饰器的使用

在Python里面函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数,简单来说函数也是变量也可以作文函数的参数 >>> def funA(): ... print('i an funA') ... time.sleep(1) >>> f = now >>> f() i am funA 函数对象有一个__name__属性,可以拿到函数的名字: >>> funA.__name__ 'funA' >>&

python3练习-装饰器

在廖雪峰的官方网站学习装饰器章节时,初步理解类似与面向切面编程.记录一下自己的课后习题解法. 问题: 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志.写出一个@log的decorator,使它既支持: @log def f(): pass 又支持: @log('execute') def f(): pass 示例代码(个人练习,如有问题欢迎斧正): # ! usr/bin/env python3 # -*- coding:utf-8 -

python3 装饰器

看廖雪峰官网的python3装饰器有感 装饰器即将一个函数作为变量在新的函数中调用此函数. 作业: 能否写出一个@log的decorator,使它既支持: @logdef f():     pass 又支持: @log('execute')def f():     pass      例1: import functools import time def log(*args,**kwargs):     # *args 是个元组     if args and isinstance(args,

python3.5.2之装饰器(1)

一.本次实验环境: 在腾讯云虚拟主机centos7上配置pyenv多版本python管理器,并安装交互式web编辑器jupyter,python版本为3.5.2.  二.装饰器: 装饰器的本质是一个函数,接收一个函数作为参数,并且返回一个函数 带参数的装饰器是一个函数,返回一个装饰器 带参数的装饰器最多允许一层,timeit()()(不允许) 在python中,一个函数可以作为参数传递给另外一个函数,还可返回一个函数(不了解此请看高阶函数)因此,我们可以把一个函数传递给另一个函数后,在这个被传递

s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法

python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf-8_*_ 或者将字符串单独声明: a = "中文".encode("utf-8") 函数式编程 函数式编程中的函数指代的是数学中的函数. 函数式编程输入如果确定,则输出一定是确定的.函数中并没有很多逻辑运算 python是一个面向对象的语言,只是一部分支持函数式编程.

python3 如何给装饰器传递参数

[引子] 之前写过一篇文章用来讲解装饰器(https://www.cnblogs.com/JiangLe/p/9309330.html) .那篇文章的定位是入门级的 所以也就没有讲过多的高级主题,决定在这里讲一下如果为装饰器传递参数 [目标] 我们有两个函数"add_fun"."add" 其中"add_fun"已经过时.如果用户有调用这个函数的话就提示它"add_fun"已经过时并且引导 它去调用"add"

python3学习之装饰器

#定义装饰器,outer参数是函数,返回也是函数 #作用:在函数执行前和执行后分别附加额外功能 def  outer(func):     def  inner(*args, **kwargs):         print("log")         func(*args, **kwargs)         print("Don't back")         # return "r"     return inner @outer de

python3.6面向对象的多继承与装饰器

# 多继承 class A: def show(self): print('AAAA') class B: def fun(self): print('BBBB') class C(B,A): pass x = C() # 类的特殊方法 ''' 类属性: __dict__ : 类的属性(包含一个字典,由类的数据属性组成) __doc__ :类的文档字符串 __name__: 类名 ''' x = 'a\nb' #print(repr(x)) #实例调用: ''' __init__    初始化

python3 闭包函数,装饰器

闭包函数: 1.定义在函数内部的函数 2.包含对外部作用域而非全局作用域的引用特点: 1.自带作用域 2.延迟计算(取到内存地址,加括号执行) def 外部函数(func): def 内部函数(*args,**kwargs): pass return 内部函数 f=外部函数(func) print(f.__closure__) print(f.__closure__[0].cell_contents) 优点: 1 自带作用域 2 惰性延迟 1.开放封闭原则,对扩展是开房的,对修改是封闭的2.装饰