python -装饰器_GYXX52的博客-程序员秘密

函数式编程
函数作为形参传入函数:
#!/usr/bin/env python
# coding:utf-8
def cacl_sum(*args):  #args为元组
        all_sum = 0
        for i in args:
                all_sum += i
        return all_sum

print cacl_sum(1,2,3,4,5)



函数作为返回值,为闭包形式
#!/usr/bin/env python
# coding:utf-8
def lazy_sum(*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的返回值,是一个函数名
print f()     #实质上调用了cacl_sum函数并运行


装饰器:
1.器可以理解为函数
2.装饰器其实就是用来装饰函数的,只是在函数原有的功呢上在添加一些其他的功能
3.装饰器的功能:比如权限的验证,日志记录,函数运行时间统计,执行函数前预备处理,执行函数后的清理等
接下来我们通过简单的例子来了解装饰器的功能:
#!/usr/bin/env python
# coding:utf-8
def addinfo(fun): #fun为函数,在此作为addinfo的形参
        def wrapped():
                print "欢迎光临中国建设银行"
                fun()
        return wrapped
@addinfo   #装饰器的语法糖,等同于login = addinfo(login)
def login():
        print "登录系统"
@addinfo
def kaihu():
        print "开户系统"
login()
kaihu()


可以利用装饰器实现函数记时器的功能
#!/usr/bin/env python
# coding:utf-8
import time #倒入time模块
def Time(fun):
        def wrapped():
                print "欢迎光临中国建设银行"
                start_time = time.time()  #函数运行前的时间
                fun()
                end_time = time.time()  #函数运行后的时间
                print "运行时间为%s" %(end_time - start_time)
        return wrapped
@Time
def login():
        print "登录系统"
@Time
def kaihu():
        print "开户系统"
login()
kaihu()


装饰器带有参数(在原有的装饰器函数上在进行闭包处理)
#!/usr/bin/env python
# coding:utf-8
def addinfo(pre = ""):  #定义空的字符串
        def info(fun):
                def wrapped():
                        print "欢迎光临建设银行的%s系统" %(pre)
                        fun()
                return wrapped
        return info
@addinfo("登陆")
def login():
        print "登录系统"
@addinfo("开户")
def kaihu():
        print "开户系统"
login()
kaihu()


装饰器案例之引入日志
#!/usr/bin/env python
# coding:utf-8
import time
def logger(fun):
        def wrapped(*args):
                fun(*args)
                print "%s start %s(%s)" %(time.time(),fun.__name__,args)
        return wrapped
@logger
def login():
        print "login"
@logger
def add(x,y):
        print x+y
login()

add(3,4)



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/GYXX52/article/details/78992478

智能推荐

关于singleInstance模式的避坑记录_singleinstance home返回__少帅的博客-程序员秘密

今天在实现画中画视频功能的时候发现某些机型无法通过由于ActivityA要全局唯一并且能保存,所以使用了singleInstance模式。当ActivityA要显示悬浮窗的时候,使用activity.moveTaskToBack(true)把ActivityA置于后台,当想返回当前ActivityA的时候,发现某些机型无法通过startActivity的方式跳转过去。可以使用ActivityManager am = (ActivityManager) activity.getSyste

MAXIMO部分AppBean类操作经验_途次早行客的博客-程序员秘密

1,弹窗错误弹窗throw new MXApplicationException("ticketsg", "invalidbg",new String[]{“测试”});这种弹窗可以在Bean类或者Mbo类内可以使用;这种方式需要在数据库maxmessages表中先定义提示消息(第一个参数是msggroup的值,第二个参数是msgkey的值,第三

深度学习方法(十七):word2vec算法原理(1):跳字模型(skip-gram) 和连续词袋模型(CBOW)_word2vec模型_大饼博士X的博客-程序员秘密

word embedding算法中最为经典的算法就是今天要介绍的word2vec,最早来源于Google的Mikolov的:1、Distributed Representations of Sentences and Documents2、Efficient estimation of word representations in vector space也是开创了无监督词嵌入的新局面,让...

mysql建表设置两个默认CURRENT_TIMESTAMP的技巧_current_timestamp(2)_javastart的博客-程序员秘密

mysql建表设置两个默认CURRENT_TIMESTAMP的技巧  2012-06-23 14:39:42|  分类: mysql|举报|字号 订阅      下载LOFTER我的照片书  |业务场景:例如用户表,我们需要建一个字段是创建时间

MySQL: Invalid default value for 'enddate'_tianboguan的博客-程序员秘密

使用MySQL官方的Workbench 5.2.3 CE 设计好E-R图之后使用正向工具生成SQL script然后连接数据库执行,结果总是提示错误。下面是提示错误的部分SQL语句:-- ----------------------------------------

yii学习记录-gii配置_weixin_30267697的博客-程序员秘密

这篇博文中你将了解到以下内容YiiDemo配置文件Yii代码生成器修改PHP执行环境变量参考Yii 是一个基于组件、纯OOP的、用于开发大型 Web 应用的高性能PHP框架。它将Web编程中的可重用性发挥到极致,能够显著加速开发进程。Yii适合大流量的应用,如门户、BBS、CMS及B2B系统等,功能丰富,性能优异 YiiDemo配置文件主要配置文件位置 ...

随便推点

ceph集群搭建手册_zeorg的博客-程序员秘密

ceph存储集群安装文档分别坐了创建ceph集群,使用客户端挂载ceph块存储系统环境:除客户端全部为centos7每台机器有两个磁盘第二个磁盘作为ceph存储磁盘IP节点名称192.168.182.150admin192.168.182.151ceph-1192.168.182.152ceph-2192.168.182.129client1、设置三个节点一个客户端的主机名称。admin节点执行[[email protected] ~]# hostnamec

BZOJ 2959: 长跑 LCT + 并查集 + 点双_weixin_30915951的博客-程序员秘密

Description  某校开展了同学们喜闻乐见的阳光长跑活动。为了能“为祖国健康工作五十年”,同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动。一时间操场上熙熙攘攘,摩肩接踵,盛况空前。  为了让同学们更好地监督自己,学校推行了刷卡机制。  学校中有n个地点,用1到n的整数表示,每个地点设有若干个刷卡机。  有以下三类事件:  1、修建了一条连接A...

进程间通信编程(5) - 信号量_fly__chen的博客-程序员秘密

信号量:(Semaphore)进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。 竞态条件(race condition)是一个在设备或者系统试图同时执行两个操作的时候出现的不希望的状况,但是由于设备和系统的自然特性,为了正确地执行,操作必须按照合适顺序进行。 在计算机内存或者存储里,如果同时发出读写大量数据的指令的时候竞

激光雷达的7大分类讲解_朽木白露的博客-程序员秘密

激光雷达是集激光、全球定位系统(GPS)、和IMU(惯性测量装置)三种技术于一身的系统,相比普通雷达,激光雷达具有分辨率高,隐蔽性好、抗干扰能力更强等优势。随着科技的不断发展,激光雷达的应用越来越广泛,在机器人、无人驾驶、无人车等领域都能看到它的身影,有需求必然会有市场,随着激光雷达需求的不断增大,激光雷达的种类也变得琳琅满目,按照使用功能、探测方式、载荷平台等激光雷达可分为不同的类型。 ...

python 使用sax 解析xml 文件_胡小牧的博客-程序员秘密

这里不是说xml 的所以如果xml 不了解,可以百度大致看下即可,SAX知识了解SAX (simple API for XML )

推荐文章

热门文章

相关标签