Python -- 装饰器

来源:互联网 发布:网络头像图片 编辑:程序博客网 时间:2024/06/03 07:39

1.装饰器
装饰:改变原有函数功能
函数作为参数,且函数作为返回值
@是装饰符号,后面跟装饰器

注意:
@decorator
在py文件被倒入时,装饰器就会运行

#解决三个问题:
1.被倒入时,装饰器运行
2.目标函数无法带参数
3.目标函数被调用后无法插入代码
#解决:利用闭包构建装饰器

def time_cost(f):    def _f(*args,**kwargs):        start=time.clock()        a=f(*args,**kwargs)        end=time.clock()        print f.__name__,'costs',end=start        return a    return _f@time_costdef f1(times):    return [i for i in times]f1(100)#解决装饰器带参数的问题:利用三层嵌套函数def time_cost(times):    def decorator(f):        def _f(*args,**kwargs):            start=time.clock()            for i in times:                a=f(*args,**kwargs)            end=time.clock()            return a        return _f    return decorator@time_costdef f()    pass

三层嵌套结构解释

在两层嵌套中,@time_cost后面没有跟任何东西,其实就是,在调用目标函数时,调用的是time_cost(f)的返回值
在三层嵌套中,@time_cost(times)返回的是一个函数,然后这个函数再作为装饰 发生作用
@time_cost(times)==>@decorator==>_f(*args,**kwargs)

装饰模式例子

#!/usr/bin/env python# coding: utf-8#copyRight by heibankedef printInfo(info):      print unicode(info, 'utf-8')def wearTrouser(f):    def _f(*arg, **kwarg):        printInfo("裤子")            return f(*arg, **kwarg)    return _fdef wearSuit(f):    def _f(*arg, **kwarg):        printInfo("西服")            return f(*arg, **kwarg)    return _fdef wearTShirt(f):    def _f(*arg, **kwarg):        printInfo("T恤")            return f(*arg, **kwarg)    return _fdef wearCap(f):    def _f(*arg, **kwarg):        printInfo("帽子")            return f(*arg, **kwarg)    return _fdef wearSportShoes(f):    def _f(*arg, **kwarg):        printInfo("运动鞋")            return f(*arg, **kwarg)    return _f    def wearLeatherShoes(f):    def _f(*arg, **kwarg):        printInfo("皮鞋")            return f(*arg, **kwarg)    return _f    def wearedPerson(person,cloths):    w = person    for f in cloths:        w=f(w)    return w#@wearTrouser    #@wearTShirt    def person(name):    printInfo("装扮好的%s" % name)if __name__ == '__main__':    #采用装饰器时(去掉装饰器的注释),是对人依次进行穿衣服的装饰    person("晓明")    print "-----------------------"    #直接采用嵌套函数时,是每穿一件衣服,嵌套一层    #(穿西装函数(穿皮鞋函数(穿裤子函数(Person))))    business_wear=[wearLeatherShoes,wearSuit,wearTrouser]    sports_wear = [wearSportShoes,wearCap,wearTShirt,wearTrouser]    weared_business_person = wearedPerson(person,business_wear)    weared_sports_person = wearedPerson(person,sports_wear)    weared_business_person("晓明")    print "-----------------------"    weared_sports_person("晓红")
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 护士资格证过期没注册怎么办 护士资格证注册时间过期怎么办 辅警体检视力不行怎么办 护士延续注册体检怀孕怎么办 护士资格证没有延续注册怎么办 申请信用卡没有座机号码怎么办 网上申请信用卡没有座机号码怎么办 我叫上门服务被骗了怎么办 上门服务被骗了3000多怎么办 微信被骗9000元怎么办 奥迪a8气囊灯亮怎么办 驾考站岗迟到了怎么办 老板欠员工工资不给怎么办 如果有一天我没头发了怎么办 苏州公积金密码忘了怎么办 科二考试第二把怎么办 科一老是记不住怎么办 科目二考试没去怎么办 网约车驾龄不到怎么办 科四预约不上怎么办 教练不退钱怎么办找谁 驾考出入证丢了怎么办 科二成绩单丢了怎么办 考驾照的准考证丢了怎么办 驾考预约去不了怎么办 科目一预约没去怎么办 打狂犬疫苗期间感冒了怎么办 公司社保欠费不交怎么办 25号社保不交怎么办欠费 会计从业停考了怎么办 黑龙江龙育黄了档案怎么办 科目四档案丢了怎么办 从上海调档案到杭州怎么办 户口迁移身份证变更护照怎么办 有中国签证的孩子怎么办户口 大学生户口在学校怎么办签证 户口在南方人才市场怎么办签证 报警电话接到说方言的怎么办 学生去新加坡旅游签证怎么办 出入境的受理编号不见了怎么办 职工下岗档案单位丢失怎么办退休