python 装饰器

函数式编程
函数作为形参传入函数
函数作为返回值
def cacl_sum(*args):
    all_sum = 0
    for i in args:
        all_sum += i
    return all_sum
cacl_sum(1,2,3,4,5)
闭包
def lazy_sum(*args):        # args 是元组
    def cacl_sum():
        all_sum = 0
        for i in args:
            all_sum += i
        return all_sum
    return cacl_sum

f = lazy_sum(1,2,3,4,5)     # f 实质是 lazy_sum 的返回值, f 实质上是一个函数名
print f()           # 调用 cacl_sum 函数并运行

15
f1 = lazy_sum(1,2,3,4,5)
f2 = lazy_sum(1,2,3,4,5)
# 当调用闭包 lazy_sum 时, 每次调用都返回一个新的函数;
print f1 == f2
False
装饰器

1.装饰器,可以理解为函数;
2.装饰器实质上是用来装饰函数的;
3.装饰器就是在原来功能基础上加上一些其他功能,即在程序执行前或者执行后加上需要的操作;
4.装饰器的功能,比如:权限的验证,日志记录, 函数运行时间统计, 执行函数前预备处理, 执行函数后清理功能等;

def addInfo(fun):
    def wrapped():
        print "欢迎使用中国邮政储蓄银行ATM......"
        fun()
    return wrapped

# 装饰器的语法糖
@addInfo
def login():
    print "login...."
login()

@addInfo
def kaihu():
    print "kaihu......"
kaihu()

欢迎使用中国邮政储蓄银行ATM......
login....
欢迎使用中国邮政储蓄银行ATM......
kaihu......
理解装饰器的实质(建议在pycharm中debug调试,查看运行过程)
装饰器的语法糖
def addInfo(fun):
def wrapped():
print "........ATM......"
fun()
return wrapped
# # 装饰器的语法糖
# login = addInfo(login)        #addInfo(login) 返回值是一个函数 , 等价于上面的语法糖;
@addInfo
def login():
print "login...."
login()                 #调用函数,需要 addInfo(login)(), login()
装饰器应用之函数计时器
import time
def Timmer(fun):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        fun(*args, **kwargs)
        end_time = time.time()
        print "%s function run %s" % (fun.__name__, end_time - start_time)
    return wrapper
@Timmer
def login():
    time.sleep(0.5)
    print "login......."

@Timmer
def myadd(x,y):
    print x+y


login()
myadd(1,2)
被装饰的函数有参数

案例参照上述代码
必选参数
默认参数
可变参数(注意: 尽量使用,通用性比较强)
关键字参数

装饰器带参数
def Info(pre="登录"):
    def addInfo(fun):
        def wrapped():
            print "欢迎使用中国邮政储蓄银行ATM的%s系统......" %(pre)
            fun()
        return wrapped
    return addInfo

# 装饰器的语法糖
@Info()
def login():
    print "login...."
@Info("开户")
def kaihu():
    print "kaihu......"

login()
kaihu()
装饰器案例之引入日志

添加装饰器@myLogger的函数都会记录日志
日志格式为 什么时间 start 什么函数 函数参数
文件操作学习后的升级: 把日志信息记录到文件/var/log/myfun.log中;

import time

def Logger(fun):
    def warpper(*args, **kwargs):
        fun(*args, **kwargs)
        print "%s start %s(%s, %s)" %(
        time.time(), fun.__name__, args, kwargs)
    return warpper
@Logger
def login():
    print "login....."
@Logger
def add(x,y):
    print x+y

login()
add(1,2)
import time
def Logger(fun):
    def warpper(*args, **kwargs):
        fun(*args, **kwargs)
        f = open("/var/log/myfun.log", 'a+')
        f.write("%s start %s(%s, %s)  %(time.time(),fun.__name__,args,kwargs))
        f.close()
    return warpper
@Logger
def login():
    print "login....."
@Logger
def add(x,y):
    print x+y

login()
add(1,2)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值