Python基础篇【第6篇】: Python装饰器

装饰器

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

举例解释:

def func1():
    some options

我们现在拥有一个已经运行了一段时间的功能函数 func1,一天我们需要一些新的功能,由于不能直接修改线上函数func1,怎么办?这时我们就可以利用装饰器。

定义一个新的装饰器函数 decorater

def auth(func):
    def inner():
        print "so some things here"
        func()
    return inner

@auth
def func1():
    print "this is func1 result"

func1()

执行结果

so some things here
this is func1 resule

解释:装饰器函数接收被装饰的函数名称,执行内部inner函数并返回inner对应内存地址。inner函数内部函数块就可以写上新的功能。我们在进行新功能函数调用时,即可执行新功能,还不用修改原函数,用户进行调用时也不需要进行代码修改。

缺陷:无法传递参数。

装饰带参数的函数

在我们定义函数时,经常需要进行参数的传递,装饰器怎么进行装饰带参数的函数呢?将装饰器添加上函数即可!即带参数的装饰器。

def auth(func):
    def inner(argv):      这里用于接收参数,以便将参数传递给后边的被装饰func函数
        print "so some things here"
        func(argv)
    return inner

@auth
def func1():
    print "func1 result"
    print argv

func1(‘argv1‘)

执行结果:

so some things here
func1 result
argv1

同理我们如果需要传递多个参数或者动态参数时,我们在装饰器内存函数inner修改为接收多个参数或者动态参数即可。并且装饰器会自动将动态参数进行自动匹配给对应的函数。即如果有的函数不需要参数有的需要参数,我们只使用一个装饰器即可。

def decorater(func):
    def inner(*args,**kwargs):
        //do some options here
        func(*args,**kwargs)

现在又遇到一个问题,我们的函数这里没有return值,能装饰带return的函数吗?

装饰器装饰带return函数的参数

在代码:

def auth(func):
    def inner():
        print "so some things here"
        func()
    return inner

@auth
def func1():
    print "this is func1 result"
    return  result

func1()

这里的函数func1带有return函数,但在实际的操作中我们使用了装饰器以后却获取不到返回值,为什么?因为我们使用了装饰器以后我们的原函数成为了装饰器inner函数的一部分,inner函数的接收到func1的return返回值,但是inner并没有return返回,所以我们获取到的return是none。

因此只要将inner函数获取到的func1函数的return值再继续return即可获得。

多层装饰器执行顺序

当装饰器 有多层时,即多个装饰器对同一个函数进行装饰时,顺序从上到下进行执行。

装饰器函数参数

@wapper(func1,func2)

执行顺序:1. 执行wapper(func1,func2)   2. 上一步的执行结果如果等于一个目标结果如ret  3.执行@ret 装饰器

即整个过程动态生成了一个装饰器。

时间: 2024-10-14 08:53:11

Python基础篇【第6篇】: Python装饰器的相关文章

Python 基础 - Day 4 Learning Note - Decorator 装饰器

装饰器的知识准备 函数,函数参数 作用域: 全局变量,局部变量 变量解析规则:LEGB法则 - 假设嵌套函数(第二层函数),解析器查找内部函数的变量的顺序如下. 在任何一层先找到了符合要求的变量,则不再向外查找.如果没有,则抛出N Local - 本地函数内部,通过任何方式赋值的,而且没有被global关键字声明为全局变量的变量 Enclosing - 直接该内部函数的外围空间(即它的上层函数)的本地作用域.多层嵌套,则有内而外逐层查找,直至最外层的函数 Global - 全局空间(模块encl

Python 基础第十一天(闭包和装饰器初识)

今日内容: 函数名的应用 闭包 装饰器的初识 装饰器的传参 1.函数名的应用 函数名是函数的名字. 本质:变量,特殊的变量.是函数的内存地址 函数名() 可以执行此函数 (1)单独打印函数名,可以得到函数的内存地址: print(func1)  # <function func1 at 0x0000000000872378> (2)函数名可以赋值 例: def func2():print(666)#f = func2print(f()) (3)函数名可以作为容器类数据的元素. 例: def f

python基础(三)闭包与装饰器

闭包(closure): 内嵌函数通过调用外部嵌套函数作用域内的变量,则这个内嵌函数就是闭包. 闭包必须满足三个条件: 必须有一个内嵌函数 内嵌函数必须引用外部嵌套函数中的变量 外部函数的返回值必须是内嵌函数 eg: def make_power(y): def fn(x): return x ** y return fn pow = make_power(2) print pow(5) #25 #声明pow时返回了函数fn并将2作为嵌套函数的参数传入 #闭包内嵌套函数传递参数时,参数保留 装饰

Python基础-----带参数验证功能的装饰器

#带参数,可以根据不同的认证类型进行认证 user_list = [ {'name':'a','password':'123'}, {'name':'b','password':'123'}, {'name':'c','password':'123'}, {'name':'d','password':'123'}] #所有用户信息列表(值为字符串类型) current_user = {'username':None,'login':False} #记录用户当前登录状态 def auth(auth

python 类中的某个函数作为装饰器

在python的类中,制作一个装饰器的函数, class A: def wrapper(func): ###装饰器 def wrapped(self,*arg,**kwargs) ... return wrapped @ wrapper ###装饰mix def mix(): ... 当调用mix的时候,self.mix() ,会将self等参数传入 wrapper 中来吗?答案为否. 当wrapper作为装饰器的并且@wrapper这种方式作为装饰的时候,wrapper就跟普通的函数一样,仅仅

python测试开发(02-闭包函数+装饰器)

一. 满足闭包函数条件# 条件一:函数中嵌套函数# 条件二:外层函数返回内层嵌套函数名# 条件三:内层嵌套函数有引用外层的一个非全局变量 def func(num, b): def inner(): print(num) print(b) print("这个三计算买书方式的函数") return inner res=func(100," python")res()print(res.__closure__) 二. 装饰器# 装饰什么函数,就传什么函数def logi

Python基础—面向对象(进阶篇)

通过上一篇博客我们已经对面向对象有所了解,下面我们先回顾一下上篇文章介绍的内容: 上篇博客地址:http://www.cnblogs.com/phennry/p/5606718.html 面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用: 类是一个模版,模板中包装了多个方法供使用(这里方法就是函数): 对象,根据模板创建的实例,实例用于调用被包装在类中的函数: 面向对象的三大特性:封装.继承.多态. 今天博客的内容主要介绍:Python类的成员.成员修饰符.类的特殊成员.异常处理和

Python基础(Django第二篇)

一.Django路由系统 说明:Django中每一个请求的url必须有一个相应的函数来处理,当请求到达时会根据urls.py文件配置的规则从上往下匹配,匹配一条则不再往下匹配. 配置文件:urls.py 配置方式: 静态路由:一个url对应一个views中的函数. 例:url(r'^index/$', views.index), 动态路由:多个URL对应一个views中的函数,此处的url多为正则匹配. 例:url(r'^index/(.*)/$', views.index), 默认路由:当此条

Python 基础【第八篇】变量

1.变量定义: 给数据进行命名,数据的名字就叫做变量 2.变量格式: [变量名] = [值] (注:python变量中名称不能使用以下字符因为已经被Python内部引用 and,as,assert,break,class,continue,def,del,elif,else,except,exec,False,finally, for,from,global,if,import,in,is,lambda,not,None,or,pass,print,raise,return,try, True,

Python基础之【第一篇】

Python简介: python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众多领域.目前业内几乎所有大中型互联网企业都在使 用Python,如:Youtube.Dropbox.BT.Quora(中国知乎).豆瓣.知乎.Google.Yahoo!.Facebook