`
美丽的小岛
  • 浏览: 308205 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

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

 
阅读更多

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

  • 描述: 123
  • 大小: 107.8 KB
分享到:
评论

相关推荐

    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独有的特性,能提高代码效率和可读性。 通过【920093577-1-208.mp4】这个视频文件,你可以实际看到讲师如何演示和解释这些...

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

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

    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