python装饰器 语法糖

简介:

装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。

比如说我们写flask,路由就是用装饰器定义的。如果写权限控制,那么权限控制一般也是由装饰器来实现的。日志记录,一般也可以通过装饰器来实现。

简单说,就是为了给某些函数增加一种或几种功能的做法。

下面举例实现。

一:基本函数

1.源码

from time import sleep

def watch_movie():
    print(‘看电影‘)
    sleep(3)
    print(‘The End‘)

if __name__ == ‘__main__‘:
    watch_movie()

2.执行结果

代码很简单,先打印看电影,间隔3秒,打印The End。

二:装饰器原理

1.目标:计算函数运行时间

2.源码

from time import sleep, time

def ceal_time():
    before = time()
    watch_movie()
    after = time()
    print(‘函数运行%s秒‘ % (after - before))

def watch_movie():
    print(‘看电影‘)
    sleep(3)
    print(‘The End‘)

if __name__ == ‘__main__‘:
    ceal_time()

3.执行结果

代码很简单,先打印看电影,间隔3秒,打印The End,然后打印函数运行计时。

4.分析

我们把一个函数放进另一个函数去运行,这就是装饰器的基本工作原理。

三:改造计时函数为通用函数

1.目标:把计算函数运行时间这个功能,适配给不同的函数。

2.源码

from time import sleep, time

def ceal_time(fun):
    before = time()
    fun()
    after = time()
    print(‘函数运行%s秒‘ % (after - before))

def watch_movie():
    print(‘看电影‘)
    sleep(3)
    print(‘The End‘)

def play_game():
    print(‘玩游戏‘)
    sleep(3)
    print(‘Game Over‘)

if __name__ == ‘__main__‘:
    ceal_time(watch_movie)
    ceal_time(play_game)

3.执行结果

看电影和玩游戏两个函数都执行了。

4.分析

我们可以把函数作为对象,传入另一个函数当中。

四:变为装饰器

1.目标:

我们改变了函数的调用方式,能不能不改变函数在调用位置的代码呢?

2.源码:

from time import sleep, time

def ceal_time(fun):
    def wrapper():
        before = time()
        fun()
        after = time()
        print(‘函数运行%s秒‘ % (after - before))

    return wrapper

@ceal_time
def watch_movie():
    print(‘看电影‘)
    sleep(3)
    print(‘The End‘)

# @ceal_time
def play_game():
    print(‘玩游戏‘)
    sleep(3)
    print(‘Game Over‘)

if __name__ == ‘__main__‘:
    watch_movie()
    play_game()

3.执行结果

看电影前面加了装饰器,实现了函数运行计时,玩游戏没有加装饰器,所以没有函数运行计时。

而且函数在main中的调用方式和没加装饰器是一样的。

五:函数有参数

1.目标:被装饰的函数,有参数的处理

2.源码:

from time import sleep, time

def ceal_time(fun):
    def wrapper(*args, **kwargs):  # 修改
        before = time()
        fun(*args, **kwargs)  # 修改
        after = time()
        print(‘函数运行%s秒‘ % (after - before))

    return wrapper

@ceal_time
def watch_movie(name, movie):
    print(‘%s在看%s电影‘ % (name, movie))
    sleep(3)
    print(‘The End‘)

# @ceal_time
def play_game(name, game):
    print(‘%s在玩%s游戏‘ % (name, game))
    sleep(3)
    print(‘Game Over‘)

if __name__ == ‘__main__‘:
    watch_movie(name=‘张三‘, movie=‘猫和老鼠‘)
    play_game(name=‘李四‘, game=‘魔兽争霸‘)

3.执行结果

4.

5.

6.

7.

8.

9.

六:

1.

2.

3.

4.

5.

6.

7.

8.

9.

七:

1.

2.

3.

4.

5.

6.

7.

8.

9.

八:

1.

2.

3.

4.

5.

6.

7.

8.

9.

九:

1.

2.

3.

4.

5.

6.

7.

8.

9.

原文地址:https://www.cnblogs.com/jackadam/p/11877034.html

时间: 2024-08-27 06:11:34

python装饰器 语法糖的相关文章

python 装饰器语法糖(@classmethod @staticmethod @property @name.)原理剖析和运用场景

引用:http://blog.csdn.net/slvher/article/details/42497781 这篇文章系统的介绍这几者之间的关系和区别.有兴趣的朋友可以到上面的链接查看原文,这里我把原文拷贝如下(如有侵权,通知马上删除) ==================================================================== 在阅读一些开源Python库的源码时,经常会看到在某个类的成员函数前,有类似于@staticmethod或@classme

python装饰器&语法糖

装饰器: 1 >>> def a(func): 2 ... def b(*argv): 3 ... print("in b") 4 ... return func(*argv) 5 ... return b 6 ... 7 >>> def c(a,b): 8 ... print(a**2,b**2) 9 ... 10 >>> c = a(c) 11 >>> c(2,3) 12 in b 13 4 9 14 >

python 装饰器(语法糖)

def  login(func):    def testlogin():        for  i in range(3):            _username="abc"            _passwrod="123456"            user_status = False            iuput = input("请输入账号:")            input1 = input("请输入密码

python学习day07 高阶函数 装饰器 语法糖

语法糖对于计算机的运行并没有任何的好处,但是对于程序员的好处是很大的,方便我们写代码,所以称为糖 #******************************装饰器************************* # 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. # 装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景 import time def func1(): print('in f

装饰器语法糖运用

装饰器语法糖运用 前言:函数名是一个特性的变量,可以作为容器的元素,也可以作为函数的参数,也可以当做返回值. 闭包定义: 内层函数对外层函数(非全局)变量的引用,这个内层函数就可以成为闭包 在Python中我们用__closure__来检查函数是否是闭包 def func1(): name = '张三' def func2(): print(name) # 能够访问到外层作用域的变量 func2() print(func2.__closure__) # (<cell at 0x1036c7438

python装饰器 语法与解读

import time #加载time模块 from functools import wraps #加载functools模块中的wraps函数 def cost_time(old_fn): # 注:cost_time是装饰器名 ,形参old_fn是要装饰的函数 装饰器最外层没有return,也就是不用返回的 @wraps(old_fn) #它主要作用就是接收到原函数中的注析,所以括号内也是上面形参一样的 def inner(*args, **kwargs): # inner它是cost_ti

5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器

一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰器 1.1什么是高阶函数? 1.1.1函数接收的参数,包涵一个函数名. 1.1.2 函数的返回值是一个函数名. 其实这两个条件都很好满足,下面就是一个高阶函数的例子. def test1(): print "hamasaki ayumi" def test2(func): return t

python装饰器总结

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

Python装饰器AOP 不定长参数 鸭子类型 重载(三)

1 可变长参数与关键字参数 *args代表任意长度可变参数 **kwargs代表关键字参数 用*args和**kwargs只是为了方便并没有强制使用它们. 缺省参数即是调用该函数时,缺省参数的值若未被传入,则传入默认预设的值. 注意 : 须将所有带有默认值的参数置于参数列表的末尾. def print_info(name, age = 18,gender = True ) print_info("zhan", gender = False ) def demo(num, *nums ,