一个函数装饰器

Python的函数是对象

Python  函数可以被赋值def  hello():–print(‘hello!’)

a = hello       #注: 此处没有() ,是一个对象

a()        # 调用a() 结果与hello() 相同

此时删除 hello,a() 依然保持原属性

函数可以定义在另一个函数里面


def say():

def hello():

return ‘hello‘

return hello

外层的say函数会把内层的 hello函数的执行结果输出

函数可以返回一个函数

可以将一个函数当作参数传递

书写一个装饰器

def  oneDecorator(oneFunction):

def  oneWrapper():

print ‘before’

oneFunction()

print  ‘after’

return  oneWrapper

def  sayHello():

print  ‘hello’

run  =  oneDecorator(sayHello)

run()

示例1

示例2

装饰器经典模式à累加装饰器

上例通过函数直接调用可写成

run  =  towDecorator(oneDecorator(sayHello))

注:被装饰的函数不写括号,代表返回的是一个对象,然后通过对象()的方式运行

run()

装饰器传递参数

只需要让包装函数传递参数即可

def  oneDecoration(oneFunction):

def   wrapper(arg1, arg2):

print(‘=’
* 50)

oneFunction(arg1, arg2)

print(‘=’
* 50)

return  wrapper

示例

使用装饰器装饰一个类中的方法

构建装饰器的时候,需要考虑self,所以在传参的时候,包装函数除了需要传递函数的参数,还要传递一个self参数

例:

def  oneDecration(onefunction):

def  wrapper(self, args1, args2):

print(‘=’* 50)

oneFunction(self, args1, args2)

print(‘=’ * 50)

return  wrapper

其它与上例无异,这里不再作演示

一个更为通用的装饰器

def  oneDecration(onefunction):

def  wrapper(*args,  **kwargs):

print(‘=’ * 50)

oneFunction(*args, **kwargs)

print(‘=’ * 50)

return  wrapper

@oneDecration

def  sayHello(name1, name2, name3):

print(‘{}: hello, {}, {}’.format(name1,name2,name3))

@oneDecration

def  sayHello1():

print(‘hello’)

sayHello1()

sayHello(‘Tom’,‘Jerry’, ‘Jim’)

装饰器一般格式

import   functools

def   装饰器名(fun):

    @functools.wraps(fun)

    def  wrapper(*args,
**kwargs):

        dosomething

        fun(*args, **kwargs)

    return  wrapper

时间: 2024-10-15 05:20:36

一个函数装饰器的相关文章

python函数装饰器详解

基础:函数装饰器的表现方式 假如你已经定义了一个函数funcA(),在准备定义函数funcB()的时候,如果写成下面的格式: @funcA def funcB():... 表示用函数funcA()装饰函数funcB().当然,也可以认为是funcA包装函数funcB.它等价于: def funcB():... funcB = funcA(funcB) 也就是说,将函数funcB作为函数funcA的参数,funcA会重新返回另一个可调用的对象(比如函数)并赋值给funcB. 所以,funcA要想作

python语法基础-函数-装饰器-长期维护

###############    装饰器的初成和开放封闭原则    ############## # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 # # 需求:计算程序执行的时间, import time def func(): start = time.time() time.sleep(0.01) print(123) end = time.time() print(end-start) func() # 这种写法如果有100个函数,你都要加一遍这是

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

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

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

python函数装饰器

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

MyPython-->进阶篇-->匿名函数 装饰器

当我们在传入函数时,有些时候,不需要显示地定义函数,直接传入匿名函数更方便 匿名函数 lambda x :x+x  实际就是 def s(x): return x+x 关键字 lambda 表示匿名函数,冒号前面的x表示 函数的参数 匿名函数有一个限制,就是只能有一个表达式,不用写return ,返回值就是该 表达式的结果 匿名函数没有名字,不必担心函数名冲突 也可以赋值给变量  在调用,也可以返回一个匿名函数 装饰器 在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运

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是万国码,可以"