python 装饰器

装饰器

装饰器是一个函数,主要用来包装另一个函数或类,装饰器的目的在不改变原函数的情况下,对原函数进行包装,添加功能

装饰器传入的是一个函数,返回的也是一个函数

我们先来看一个简单的函数

import time

def sum1():
    sum = 1+ 2
    print (sum)

def timeit(func):
    def test():
        start = time.clock()
        func()
        end =time.clock()
        print("time used:", end - start)
    return test

sum1 = timeit(sum1)
sum1()

上面那段代码其实就实现了装饰器的功能,对sum1函数进行包装,添加了计时功能。

注意:timeit传入的是函数名,如果在函数名后面加上(),则是执行这个函数,如果只是函数名,这是传参函数。

python就提出了装饰器来降低上面字符串的输入量

import time
  
def timeit(func):
     def test():
         start = time.clock()
         func()
         end =time.clock()
         print("time used:", end - start)
     return test
 
@timeit
def sum1():
     sum = 1+ 2
     print (sum)

 sum1()

语法

  def 装饰器函数名(参数):

    语句块

    return 函数对象

  @装饰器函数名

  def 函数名(形参列表):

    语句块

 1 def mydeco(fn):
 2     def fx():
 3         print("=========这是myfunc调用之前==========")
 4         fn()
 5         print('---------这是myfunc调用之后----------')
 6     return fx
 7 
 8 @mydeco
 9 def myfunc():
10     print("myfunc被调用")
11 
12 # myfunc = mydeco(myfunc)  # 原理是改变原变量绑定的函数
13 
14 myfunc()
15 
16 #=========这是myfunc调用之前==========
17 #myfunc被调用
18 #---------这是myfunc调用之后----------

闭包

 1 def yanzhen(fn):    #闭包函数
 2     def fx(name,x):
 3         print("可以用if语句进行判断,进行验证,验证通过使用fn语句")
 4         fn(name,x)
 5     return fx
 6 
 7 @yanzhen
 8 def q_money(name,x):    #取钱
 9     print("取钱")     #不写return,默认返回None
10 
11 @yanzhen
12 def c_money(name,x):    #存钱
13     print("存钱")
14 
15 q_money("凌贤鹏",300)
16 print("-----------------------")
17 c_money("文庆华",500)
18 
19 #可以用if语句进行判断,进行验证,验证通过使用fn语句
20 #取钱
21 #-----------------------
22 #可以用if语句进行判断,进行验证,验证通过使用fn语句
23 #存钱
原文地址:https://www.cnblogs.com/LXP-Never/p/9327093.html