吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4002|回复: 10
收起左侧

[Python 转载] 简单介绍Python装饰器(一)

  [复制链接]
lovingxiaobing 发表于 2018-7-26 20:50

装饰器的作用

相信大家在

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

这次小冰也来讲解一下关于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[0] and password==acAndPas[1]:
                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。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
吾爱妹子涛 + 1 + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

聪明的栋栋 发表于 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
中间那个例子运行的话电脑就跪了。。。运算量太大了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 03:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表