首页 > 其他 > 详细

装饰器

时间:2019-07-11 17:52:54      阅读:139      评论:0      收藏:0      [点我收藏+]

一.闭包函数:

闭包函数:
闭:定义在函数内部的函数
包:内部的函数引用了外部函数作用域的名(变量名)
闭包也是一种传参方式

def outter(x,y):
    # x = 1
    # y = 2
    def my_max():
        if x > y:
            return x
        return y
    return my_max
res = outter(1,2)   # outter加()本身会得到一个返回值my_max,实参1和2相当于变量值传给了x和y两个变量名
print(res())

技术分享图片

import requests  # 爬虫模块

#方式一 直接给函数传参
info1 =  https://www.baidu.com
info2 = ......
def my_get(rul):
    resuit = requests.get(rul)
    if resuit.status_code == 200:
        print(len(resuit.text))
my_get(info1)
my_get(info2)
.....


#方式二 用闭包的方式给函数传参
def outter(func):
    # func =  ‘https://www.jd.com‘
    def my_get(func):
        resuit = requests.get(func)
        if resuit.status_code == 200:
            print(len(resuit.text))
    return my_get
res_jd = outter( https://www.jd.com)  # res = my_get
res_jd()  # my_get()

二.装饰器:

装饰器
器:就是一个工具
装饰:给被装饰对象(函数)添加功能
开放封闭原则:
开放:对扩展开放
封闭:对修改封闭

装饰器(被调用对象)必须遵循的两大原则:
1.不改变装饰对象(被装饰函数)的源码
2.不改变被装饰对象的调用方式
技术分享图片
 import time
print(time.time())
# 1562812014.731474 时间戳  当前时间距离1970-1-1 00:00:00相差的秒数
# 1970-1-1 00:00:00是Unix诞生元年


 time.sleep(3)  # 让cpu谁三秒   让你的程序暂停三秒
 print(FBI!)
time 模块

 

统计func函数运行时间:
# 简单版:
def func():
    time.sleep(2)  # 让cpu睡眠2秒
    print(form func)

star_res = time.time()
func()
over_res = time.time()
print(运行时间: %s%(over_res - star_res))
# >>> 运行时间: 2.00064754486084
#此时的计算时间功能只能func函数单独使用,如果其他函数也要用到时间计算功能需要重新编写代码,
# 可以把计算时间功能封装成一个函数给其他函数使用


#有装饰器版

def func():
    time.sleep(2)  # 让cpu睡眠2秒
    print(form func)

def outter(info):  # info = 原始func的内存地址
    def time_func():
        star_res = time.time()
        info()  # 相当于 func() 函数运行
        over_res = time.time()
        print(运行时间: %s%(over_res - star_res))
    return time_func
func = outter(func)  # 新 func = time_func的内存地址
func()  # 相当于 time_func()函数运行

# >>> form func
# >>> 运行时间: 2.0006558895111084
技术分享图片
import time
def index():
    time.sleep(3)
    print(澳门最大线上赌场开业啦 性感tank在线发牌!)
    return index
# res1 = index()

def login(name):
    time.sleep(1)
    print(%s is sb%name)
    return login
# res = login(‘egon‘)

def outter(func):  # func = 最原始的login函数的内存地址
    def get_time(*args, **kwargs):  # args = (‘egon‘,) kwargs = {}
        start = time.time()
        res = func(*args, **kwargs)  # 最原始的login函数的内存地址() 直接调用  func(‘egon‘)
        end = time.time()
        print(func run time:%s%(end-start))
        return res
    return get_time
login = outter(login)  # outter(最原始的login函数的内存地址)
res = login(egon)
print(res)
# >>>egon is sb
# >>>func run time:1.000328779220581
# >>>login

index = outter(index)
res1 = index()
print(res1)
# >>>澳门最大线上赌场开业啦 性感tank在线发牌!
# >>>func run time:3.0011234283447266
# >>>index
利用*args和**args解决有参无参均可调用问题

在装饰器内,定义形参 *args ,**kwargs 可以接收有参无参函数

def func():
    time.sleep(2)  # 让cpu睡眠2秒
    print(form func)
    return 函数func的返回值

def user(name):
    time.sleep(1)
    print(welcome %s%name)
    return 函数user的返回值

def outter(info):  # info = 原始func的内存地址  # info = 原始user的内存地址
    def time_get(*args,**kwargs):
        # args = ‘ ‘
        # kwargs = ‘ ‘  闭包函数的特性
        star_res = time.time()
        res = info(*args,**kwargs)  # 相当于 func() 函数运行  # 相当于user()函数运行,但函数user必须要传参才能执行
        over_res = time.time()
        print(运行时间: %s%(over_res - star_res))
        return res
    return time_get
func = outter(func)  # 新 func = time_get的内存地址
res_1 =func()  # 相当于 time_get()函数运行
print(res_1)   # res_1 = res = 函数func的返回值
# >>> form func
# >>> 运行时间: 2.0006558895111084
# >>> 函数func的返回值

user = outter(user)  # 新 user = rime_get 的内存地址
res_2 = user(wong)  # 相当于 time_get()运行函数
print(res_2)
# >>> welcome wong
# >>> 运行时间: 1.000464677810669
# >>> 函数user的返回值

 

 
 

装饰器

原文:https://www.cnblogs.com/waller/p/11171478.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!