python装饰器

前言:首先我们要知道为什么会有装饰器的出现,很多函数可能运行之前需要做一些处理,比如先查询数据库,先做一些判断,当你写的代码,你发现你很多函数里面都要做同样的功能的时候,你就可以把他提炼出来,单独的封装成一个函数,也就是我们的装饰器函数,避免了我们重复造轮子

 

#1。函数概念
def fun():
    print(“in test”)
#调用函数
fun()
ret = fun
ret()
#打印id返回值相同
print(id(ret))
print(id(fun))




# 2.闭包概念的引入
def test(num1):
    print(“test”)
    def in_test(num2):
        #内部函数可以继承外部函数的环境变量
        print(“sum =%d”%(num1 + num2))
    #注意返回值是内部函数名字,不是内部函数
    return in_test
#test(1)的返回值就是返回的返回值等价与---“test1 = in_test
test1 = test(1)
#squate test1就等于调用in_test
test1(2)




#3.闭包案例 - 计算直线的y值y = k * x + b
def line_conf(k,b):
    def line(x):
        y = k * x + b
        print(“纵坐标: %d“%y)
    返回行
line1 = line_conf(1,2)
line1(2)
line1(3)


line2 = line_conf(2,1)
line2(1)
line2(5)


#line1,line2指向的内部函数是完全独立的数据空间
line1(1)




#4修改外部环境变量。
DEF line_conf(K,b):
    DEF线(X):
        #python3中修改环境变量的方式
        非局部ķ
        下面ķ被重新赋值了,不再是参数传进来的ķ值
        k = 2时
        y = k * x + b
        print(“纵坐标:%d”%y)
    返回行
line1 = line_conf(1,2)
line1(1)


#5。再议函数概念
def foo():
    print(“foo”) )
foo
foo()


def fun():
    print(“fun”)


#下面这个函数让fun重新指向了一个空间,不再指向原来的数据空间
fun = lambda x:x + 1
print(fun(1))




#decoration:概念引入
def func(fun):
    def inner():
        print(“开始验证”)
        fun()
        print(“验证完成”)
    return inner


def f1():
    #开闭原则:对拓展的开放的,对修改是关闭的
    print(“test”)


f1()
f1 = func(f1)
f1()




#装饰器
def func(fun):
    def inner():
        print(“开始验证”)
        fun()
        print( “验证完成”)
    返回内部
@func
def f1():
    print(“in - test - 1”)
@func
def f2():
    print(“in - test - 2”)
f1()
f2( )导入时间def get_time(func):




8,9使用装饰器统计函数运行时间#设置不定长参数,无论下面函数想传啥参数都可以接收



    def inner(* args,** kwargs):
        begin = time.time()
        func(* args,** kwargs)
        end = time.time()
        print(“花费时间:%fs”%(end-begin))
    返回内部
@get_time
def fun0(num):
    print(“fun0%d”%num)
@get_time
def fun1():
    for range in range(6):
        time.sleep(0.5)
    print(“in fun1”)
fun0 (9)
fun1()




#10。装饰有函数返回值的函数
导入时间
def get_time(fun):
    def inner():
        begin = time.time()
        fun()
        end = time.time()
        print(“函数”执行时间为:%fs“%(end-begin))
    返回内部


@get_time
def fun1():
    for range in range(6):time.sleep
        (0.5)


@get_time
def fun2():
    for i in range(8):
        time.sleep(0.1)


fun1()
fun2()




#11。原本装饰器函数只能接受一个参数,就是被装饰的函数
#装饰器工厂函数就是接收传给装饰器函数的参数,层层遗传,从而控制装饰器
#装饰器工厂函数的特点内部函数是一个装饰器函数
import time
def get_run_time(flag):
    def get_time(func):
        def inner(* args,** kwargs):
            begin = time.time()
            ret = func(* args,** kwargs)
            end = time.time( )
            if flag =='int':
                print(“花费时间:%ds”%int(end-begin))
            else:
                print(“花费时间:%fs”%(end-begin))
            return ret
        返回内部
    返回get_time


@get_run_time('int')#返回值就是get_time
def fun1(num):
    print(“in-test-%d”%num)
    返回100
@get_run_time('float')
def fun2(num ):
    print(“in fun2-%d”%num)
    return 100


fun1(88)
fun2(99)




#12。类装饰器
类Test():
    def __init __(self,func):
        self.func = func
    def __call__ (self,* args,** kwargs):
        print(“正在验证”)
        self.func()
        print(“验证完成”)


@Test
def test():
    print(“in-test”)
#test = Test( test)
#实例对象()===调用测试。__呼叫__()
test()






#13。多个装饰器修饰一个函数
#定义函数:完成包裹数据
def makeBlod(fn):
    def wrapped():
        返回“<b>”+ fn()+“</ b>”
    返回包装
def makeItalic(fn):
    def wrapped():
        返回“<i>”+ fn()+“</ i>”
    返回包装
#f1 = makeBlod(f1 = makeItalic(f1))
@
makeBlod @makeItalic
def f1() :
    返回“python”


print(f1())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值