`

Python装饰器学习(九步入门)

 
阅读更多

ython装饰器学习(九步入门)

这是在Python学习小组上介绍的内容,现学现卖、多练习是好的学习方式。

第一步:最简单的函数,准备附加额外功能

?
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入门 & 进阶 & 原生爬虫实战完全解读

    12.10_装饰器(三)|函数式编程__匿名函数、高阶函数、装饰器|Python3.8入门_&_进阶_&_原生爬虫实战完全解读

    人工智能实践教程-从Python入门到机器学习邵一川-教学大纲-8页.doc

    《人工智能实践教程——从Python入门到机器学习》是一门针对通信工程、计算机、大数据、人工智能相关专业设计的专业基础课程,旨在让学生掌握Python编程基础知识,并具备独立开发Python简单项目的能力。课程涵盖...

    深度学习入门-Python语言学习-01Python简介及环境搭建-入门学习

    Python语言学习入门指南 Python是一种流行的编程语言,应用领域非常广泛。其优点包括学习成本低、开源、适应人群广泛、应用领域...同时,需要了解Python的高级知识,包括面向对象编程、装饰器、生成器、异步编程等。

    Python教程入门到精通:千锋Python语法基础学习视频教程.pdf

    7. **装饰器、偏函数、作用域、异常处理和文件读写**:讲解高级概念如装饰器(decorator),用于修改函数行为;偏函数(partial function)用于定制函数参数;理解作用域规则;异常处理(try/except)用于错误处理;...

    Python学习入门书籍

    - 这本书可能提供了一条从基础到精通的学习路径,除了基本语法,可能还涵盖了高级特性,如生成器、装饰器、上下文管理器,以及Python在Web开发、网络编程等方面的应用。 6. **用Python做科学计算**: - 科学计算...

    全网最全Python课程,从入门到精通!.pdf

    - 涵盖Python的高级特性,如生成器、闭包、装饰器、大小整数池、intern机制等。 - 第七阶段:网页编程 (311-403集) - 主要关注HTML5与Python的结合,可能涉及到前端开发的相关知识。 3. **Python终极** (401-556...

    619263 零基础入门学习Python.zip

    【Python编程语言基础】 Python是一种高级、通用的编程语言,以其简洁、易读的语法而闻名,适合初学者入门...同时,不断探索Python的更高级特性,如装饰器、生成器、上下文管理器等,将使你成为更熟练的Python开发者。

    Python从入门到进阶知识手册1885页.pdf

    2. **进阶主题**:涉及更复杂的概念,如异常处理(try-except)、面向对象编程(类与对象、继承、多态、封装)、文件操作、模块的发布和安装、函数式编程(高阶函数、闭包、装饰器)、列表推导式、集合和元组的运用...

    python快速入门学习资料

    同时,学习资料中还可能会涵盖异常处理(try-except)、装饰器、生成器等进阶话题,这些都是Python编程中非常实用的特性。 在"Python从入门到入魔学习资料"这个压缩包中,你可能会发现更多的实战教程和案例分析,...

    Python进阶自学书籍入门到精通PDF下载

    4. **函数式编程**:Python支持函数式编程风格,书中会介绍高阶函数、闭包、装饰器以及生成器等概念,帮助读者掌握更简洁、高效的编程方式。 5. **并发编程**:讲解Python中的多线程、多进程以及异步I/O(如`...

    Python入门教程+1小时入门+简明教程+核心编程(非常全面经典的中文学习Python资料)

    "核心编程"则深入到Python的高级特性,如装饰器、生成器、上下文管理器等,以及更复杂的模块如网络编程、数据库操作等。对于希望成为专业Python开发者的人来说,这部分内容至关重要。 "Python_chn.pdf"和"Python ...

    Python装饰器入门学习教程(九步学习)

    装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果。相对于其它...

    Python编程入门 第3版.pdf

    - 装饰器:一种用于修改或增强函数功能的函数。 - 上下文管理器:使用with语句实现的特定协议的对象,用于管理资源。 这些知识点的介绍仅为概述,每个主题都包含大量的细节和示例代码。Python编程入门书籍会详细...

    超完整Python基础入门知识教程Python从入门到进阶知识大全Python开发基础知识能力

    7. 闭包与装饰器:学习闭包的概念,以及如何创建和使用装饰器来增强函数的功能。 四、异常处理 8. 异常处理:掌握Python中的异常类型,学会使用try/except语句进行错误处理,以及finally子句确保关键代码的执行。 ...

    【Python教程】《零基础入门学习Python》

    最后,你可能还会接触到一些进阶主题,如装饰器、生成器、上下文管理器等,这些都是Python独有的特性,能提高代码效率和可读性。 通过【920093577-1-208.mp4】这个视频文件,你可以实际看到讲师如何演示和解释这些...

    Python 零基础入门学习

    ### Python零基础入门学习知识点概览 #### 一、Python基础知识 1. **Python简介**: - Python的发展历史。 - Python的应用领域:Web开发、数据分析、人工智能、自动化脚本编写等。 - Python的优点:简洁易读、...

    Python从入门到精通_python_python教程_

    最后,我们将接触到Python的高级特性,如装饰器、生成器、上下文管理器,这些都让Python代码更加灵活高效。 在实践部分,通过解决实际问题,如爬虫、数据分析、自动化脚本等,学习者可以巩固所学知识,并提升解决...

    python入门与进阶

    装饰器和生成器也是Python的特色,它们能够优雅地处理函数增强和高效生成序列。 在"深度学习"这个标签下,Python扮演着至关重要的角色,因为它是目前最常用的深度学习语言。深度学习库如TensorFlow、Keras和PyTorch...

    Python编程三剑客第3版:Python编程从入门到实践第3版快速上手第.pptx

    7. 装饰器:包括装饰器的定义、使用和注意事项等。 8. 生成器:包括生成器的定义、使用和注意事项等。 9. 上下文管理器:包括上下文管理器的定义、使用和注意事项等。 10. 泛型编程:包括泛型编程的基本概念、...

Global site tag (gtag.js) - Google Analytics