lovingxiaobing 发表于 2018-7-26 20:50

简单介绍Python装饰器(一)

###装饰器的作用

相信大家在

探索过程中已经了解装饰器的作用,也有很多花里胡哨的介绍。

这次小冰也来讲解一下关于***Python装饰器***的一些小知识。


**它的作用:**
- **性能测试**
- **日志**
- **安全验证**
......

相信大家已经迫不及待的想知道怎么个用法啦~

就用性能测试这个话题来说吧。
比如测试*运行时间*

比如我们要测试执行一个函数要花的时间。

我们可以这样子写:

```
#-*-coding:utf-8-*-
import time

def foo():
    pass

start = time.time()
foo()
end = time.time()

print("运行耗时:", end - start)
```


看起来暂时没什么压力对吧。


好的,我们如果我们要对一大堆函数进行性能测试,那么我们要写多少个重复的代码呀,这得浪费多少时间呀。


这会咋们有救啦!用**装饰器**!

```
#-*-coding:utf-8-*-
import math

#装饰器
def test(func):
    def wrapper():
      start = time.time()
      #执行要测试的函数
      func()
      end = time.time()
      print(func.__name__, "运行耗时:", end - start)
    return wrapper

@test
def foo1():
    pass

@test
def = foo2():
    pass
# .......

@test
def foon():
    pass

#执行函数
foo1()
foo2()
foon()
```

emmmm开始有点样子了~~
但这是个什么原理呢?
小冰就用一点都不专业的方式给大家解释解释:

首先,我们先写好一个装饰器函数,装饰器是要给Py解释器看的,当然想让它看中你就得包装好啦。比如上面的装饰器**test**中的wrapper是干啥子的?!!wrapper就是把装饰好的函数给Py解释器,让他去执行。

那要给函数传参数怎么办!!!Σ(*゚д゚ノ)ノ
那要取回函数的返回值怎么办!!!(|||゚д゚)
别着急,咋们给这个test再升级!

看代码:

```
#-*-coding:utf-8-*-
import time

def test(func):
    def wrapper(n):
      start = time.time()
      ret = func(n)
      end = time.time()
      print(func.__name__, "运行耗时:", end - start)
      return ret
    return wrapper

#这回就来测一测循环运行n次所消耗的时间吧
@test
def counter(n):
    ret = 0
    #来个猛一点
    for number in range(n**n):
      x = number ** number
      y = number ** number** number
      ret += x ** y
    return ret

#运行函数
retNum1 = counter(520)
retNum2 = counter(1314)

print("结果1:", retNum1)
print("结果2:", retNum2)

```
到这里相信大家对这个神秘而又,,,忘词了,不管他…

来实践一下吧,这回咋们弄一个安全验证。

```
#-*-coding:utf-8-*-
#这个是加密解密模块
#jiamijiemi.py

import xxx
from xxxx import xx
#假装我们已经写好了对账户密码进行加密和解密的函数。

__all__ = ["jiaMi", "jieMi"]

#加密
def jiaMi(data):
    pass
    return reData#加密后的数据
#解密
def jieMi(data)
    pass
    return reData#解密后的数据
```
emmmm,还有一个存相互密码的加密文本呢。

`key.jiami` 假装这是一个加密过的文本
```
account:小冰哟
password:lovingxiaobing
```

比如我们有一个函数,要去运行它要有权限,权限哪里来呢,要登录才能得到权限去运行它,怎么做么,看我操作!!!

```
#-*-coding:utf-8-*-
from jiamijiemi import *

#安全验证
def login(mySecretFunc):
    def run(**kw):
      with open("key.jiami", "rb") as data
      #假装在解密
            kansee = jieMi(data.read())

            acAndPas = kansee.split("\n")

            account = input("输入账号:")
            password = input("输入密码:")
            if account==acAndPas and password==acAndPas:
                print("暖心小提示:看看周围有没有人再调高音量哟")
                return mySecretFun(**kw)
            else:
                raise ValueError("登录验证失败!")
return run

@login
def findMyGirl(**kw):
    name = kw.get("name", None)
    #默认视频
    types = kw.get("types", "movie")
    if name==None:
      print("乱来,先别激动")
      exit(-1)
    #这里省略n行代码,查找隐藏在硬盘里的女神
    #这个是查找到的结果
    #resultList
    return resultList

movie = findMyGirl(name = "仓xx", types = "movie")
pic = findMyGirl(name = "xx麻子xx依", types = "pictrue")

print("查找到的电影:", movie)
print("查找到的图片:", pic)

```

我:还有么?
python:当然了~~
我: ` (゚д゚≡゚д゚) `   
python:我不仅会用函数装饰器来打扮,而且还有类装饰器呢~~ ` ㄟ(≧◇≦)ㄏ `   
我: ` Σ( ° △ °) `   
我和Python:敬请期待下一期吧~~~


**你们肯定偷偷的copy实践代码,肯行跑不起来,哈哈哈。_仅供参考_哟~~~**

本文编辑使用Markdown。

聪明的栋栋 发表于 2018-7-26 21:45

参考 参考

b3b4b5b6 发表于 2018-7-26 22:12

好复杂的样子,我正在学python,等回头再来学习下,现在基本的语法还没弄明白,这个根本看不懂,只能看个大概

cyhcuichao 发表于 2018-7-26 22:17

感谢楼主

雨落荒原 发表于 2018-7-27 09:27

感谢楼主

rik7821 发表于 2018-7-27 15:58

感谢楼主!都快忘记了,原理还是没有搞太明白

粗心人 发表于 2018-8-10 15:41

厉害,居然还有加密解密模块

yyamm0303 发表于 2018-9-19 13:27

感谢楼主的分享,如果再说的详细一些更好了。

归璨 发表于 2018-9-20 09:50

一直觉得装饰器不太好理解,谢谢楼主的讲解

鱼在水中飞 发表于 2018-9-20 17:02

中间那个例子运行的话电脑就跪了。。。运算量太大了
页: [1] 2
查看完整版本: 简单介绍Python装饰器(一)