http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html
第一步:最简单的函数,准备附加额外功能
1
2
3
4
5
6
7
8
|
# -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc():
print ( "myfunc() called." )
myfunc() myfunc() |
第二步:使用装饰函数在函数执行前和执行后分别附加额外功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# -*- coding:gbk -*- '''示例2: 替换函数(装饰) 装饰函数的参数是被装饰的函数对象,返回原函数对象 装饰的实质语句: myfunc = deco(myfunc)''' def deco(func):
print ( "before myfunc() called." )
func()
print ( " after myfunc() called." )
return func
def myfunc():
print ( " myfunc() called." )
myfunc = deco(myfunc)
myfunc() myfunc() |
第三步:使用语法糖@来装饰函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# -*- coding:gbk -*- '''示例3: 使用语法糖@来装饰函数,相当于“myfunc = deco(myfunc)” 但发现新函数只在第一次被调用,且原函数多调用了一次''' def deco(func):
print ( "before myfunc() called." )
func()
print ( " after myfunc() called." )
return func
@deco def myfunc():
print ( " myfunc() called." )
myfunc() myfunc() |
第四步:使用内嵌包装函数来确保每次新函数都被调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# -*- coding:gbk -*- '''示例4: 使用内嵌包装函数来确保每次新函数都被调用, 内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象''' def deco(func):
def _deco():
print ( "before myfunc() called." )
func()
print ( " after myfunc() called." )
# 不需要返回func,实际上应返回原函数的返回值
return _deco
@deco def myfunc():
print ( " myfunc() called." )
return 'ok'
myfunc() myfunc() |
第五步:对带参数的函数进行装饰
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# -*- coding:gbk -*- '''示例5: 对带参数的函数进行装饰, 内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象''' def deco(func):
def _deco(a, b):
print ( "before myfunc() called." )
ret = func(a, b)
print ( " after myfunc() called. result: %s" % ret)
return ret
return _deco
@deco def myfunc(a, b):
print ( " myfunc(%s,%s) called." % (a, b))
return a + b
myfunc( 1 , 2 )
myfunc( 3 , 4 )
|
第六步:对参数数量不确定的函数进行装饰
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# -*- coding:gbk -*- '''示例6: 对参数数量不确定的函数进行装饰, 参数用(*args, **kwargs),自动适应变参和命名参数''' def deco(func):
def _deco( * args, * * kwargs):
print ( "before %s called." % func.__name__)
ret = func( * args, * * kwargs)
print ( " after %s called. result: %s" % (func.__name__, ret))
return ret
return _deco
@deco def myfunc(a, b):
print ( " myfunc(%s,%s) called." % (a, b))
return a + b
@deco def myfunc2(a, b, c):
print ( " myfunc2(%s,%s,%s) called." % (a, b, c))
return a + b + c
myfunc( 1 , 2 )
myfunc( 3 , 4 )
myfunc2( 1 , 2 , 3 )
myfunc2( 3 , 4 , 5 )
|
第七步:让装饰器带参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# -*- coding:gbk -*- '''示例7: 在示例4的基础上,让装饰器带参数, 和上一示例相比在外层多了一层包装。 装饰函数名实际上应更有意义些''' def deco(arg):
def _deco(func):
def __deco():
print ( "before %s called [%s]." % (func.__name__, arg))
func()
print ( " after %s called [%s]." % (func.__name__, arg))
return __deco
return _deco
@deco ( "mymodule" )
def myfunc():
print ( " myfunc() called." )
@deco ( "module2" )
def myfunc2():
print ( " myfunc2() called." )
myfunc() myfunc2() |
第八步:让装饰器带 类 参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# -*- coding:gbk -*- '''示例8: 装饰器带类参数''' class locker:
def __init__( self ):
print ( "locker.__init__() should be not called." )
@staticmethod
def acquire():
print ( "locker.acquire() called.(这是静态方法)" )
@staticmethod
def release():
print ( " locker.release() called.(不需要对象实例)" )
def deco( cls ):
'''cls 必须实现acquire和release静态方法'''
def _deco(func):
def __deco():
print ( "before %s called [%s]." % (func.__name__, cls ))
cls .acquire()
try :
return func()
finally :
cls .release()
return __deco
return _deco
@deco (locker)
def myfunc():
print ( " myfunc() called." )
myfunc() myfunc() |
第九步:装饰器带类参数,并分拆公共类到其他py文件中,同时演示了对一个函数应用多个装饰器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
# -*- coding:gbk -*- '''mylocker.py: 公共类 for 示例9.py''' class mylocker:
def __init__( self ):
print ( "mylocker.__init__() called." )
@staticmethod
def acquire():
print ( "mylocker.acquire() called." )
@staticmethod
def unlock():
print ( " mylocker.unlock() called." )
class lockerex(mylocker):
@staticmethod
def acquire():
print ( "lockerex.acquire() called." )
@staticmethod
def unlock():
print ( " lockerex.unlock() called." )
def lockhelper( cls ):
'''cls 必须实现acquire和release静态方法'''
def _deco(func):
def __deco( * args, * * kwargs):
print ( "before %s called." % func.__name__)
cls .acquire()
try :
return func( * args, * * kwargs)
finally :
cls .unlock()
return __deco
return _deco
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# -*- coding:gbk -*- '''示例9: 装饰器带类参数,并分拆公共类到其他py文件中 同时演示了对一个函数应用多个装饰器''' from mylocker import *
class example:
@lockhelper (mylocker)
def myfunc( self ):
print ( " myfunc() called." )
@lockhelper (mylocker)
@lockhelper (lockerex)
def myfunc2( self , a, b):
print ( " myfunc2() called." )
return a + b
if __name__ = = "__main__" :
a = example()
a.myfunc()
print (a.myfunc())
print (a.myfunc2( 1 , 2 ))
print (a.myfunc2( 3 , 4 ))
|
下面是参考资料,当初有不少地方没看明白,真正练习后才明白些:
1. Python装饰器学习 http://blog.csdn.net/thy38/article/details/4471421
2. Python装饰器与面向切面编程 http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
3. Python装饰器的理解 http://apps.hi.baidu.com/share/detail/17572338
相关推荐
12.10_装饰器(三)|函数式编程__匿名函数、高阶函数、装饰器|Python3.8入门_&_进阶_&_原生爬虫实战完全解读
《人工智能实践教程——从Python入门到机器学习》是一门针对通信工程、计算机、大数据、人工智能相关专业设计的专业基础课程,旨在让学生掌握Python编程基础知识,并具备独立开发Python简单项目的能力。课程涵盖...
Python语言学习入门指南 Python是一种流行的编程语言,应用领域非常广泛。其优点包括学习成本低、开源、适应人群广泛、应用领域...同时,需要了解Python的高级知识,包括面向对象编程、装饰器、生成器、异步编程等。
7. **装饰器、偏函数、作用域、异常处理和文件读写**:讲解高级概念如装饰器(decorator),用于修改函数行为;偏函数(partial function)用于定制函数参数;理解作用域规则;异常处理(try/except)用于错误处理;...
- 这本书可能提供了一条从基础到精通的学习路径,除了基本语法,可能还涵盖了高级特性,如生成器、装饰器、上下文管理器,以及Python在Web开发、网络编程等方面的应用。 6. **用Python做科学计算**: - 科学计算...
- 涵盖Python的高级特性,如生成器、闭包、装饰器、大小整数池、intern机制等。 - 第七阶段:网页编程 (311-403集) - 主要关注HTML5与Python的结合,可能涉及到前端开发的相关知识。 3. **Python终极** (401-556...
【Python编程语言基础】 Python是一种高级、通用的编程语言,以其简洁、易读的语法而闻名,适合初学者入门...同时,不断探索Python的更高级特性,如装饰器、生成器、上下文管理器等,将使你成为更熟练的Python开发者。
2. **进阶主题**:涉及更复杂的概念,如异常处理(try-except)、面向对象编程(类与对象、继承、多态、封装)、文件操作、模块的发布和安装、函数式编程(高阶函数、闭包、装饰器)、列表推导式、集合和元组的运用...
同时,学习资料中还可能会涵盖异常处理(try-except)、装饰器、生成器等进阶话题,这些都是Python编程中非常实用的特性。 在"Python从入门到入魔学习资料"这个压缩包中,你可能会发现更多的实战教程和案例分析,...
4. **函数式编程**:Python支持函数式编程风格,书中会介绍高阶函数、闭包、装饰器以及生成器等概念,帮助读者掌握更简洁、高效的编程方式。 5. **并发编程**:讲解Python中的多线程、多进程以及异步I/O(如`...
"核心编程"则深入到Python的高级特性,如装饰器、生成器、上下文管理器等,以及更复杂的模块如网络编程、数据库操作等。对于希望成为专业Python开发者的人来说,这部分内容至关重要。 "Python_chn.pdf"和"Python ...
装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果。相对于其它...
- 装饰器:一种用于修改或增强函数功能的函数。 - 上下文管理器:使用with语句实现的特定协议的对象,用于管理资源。 这些知识点的介绍仅为概述,每个主题都包含大量的细节和示例代码。Python编程入门书籍会详细...
最后,你可能还会接触到一些进阶主题,如装饰器、生成器、上下文管理器等,这些都是Python独有的特性,能提高代码效率和可读性。 通过【920093577-1-208.mp4】这个视频文件,你可以实际看到讲师如何演示和解释这些...
7. 闭包与装饰器:学习闭包的概念,以及如何创建和使用装饰器来增强函数的功能。 四、异常处理 8. 异常处理:掌握Python中的异常类型,学会使用try/except语句进行错误处理,以及finally子句确保关键代码的执行。 ...
### Python零基础入门学习知识点概览 #### 一、Python基础知识 1. **Python简介**: - Python的发展历史。 - Python的应用领域:Web开发、数据分析、人工智能、自动化脚本编写等。 - Python的优点:简洁易读、...
最后,我们将接触到Python的高级特性,如装饰器、生成器、上下文管理器,这些都让Python代码更加灵活高效。 在实践部分,通过解决实际问题,如爬虫、数据分析、自动化脚本等,学习者可以巩固所学知识,并提升解决...
装饰器和生成器也是Python的特色,它们能够优雅地处理函数增强和高效生成序列。 在"深度学习"这个标签下,Python扮演着至关重要的角色,因为它是目前最常用的深度学习语言。深度学习库如TensorFlow、Keras和PyTorch...
7. 装饰器:包括装饰器的定义、使用和注意事项等。 8. 生成器:包括生成器的定义、使用和注意事项等。 9. 上下文管理器:包括上下文管理器的定义、使用和注意事项等。 10. 泛型编程:包括泛型编程的基本概念、...