Python装饰器有趣实例探究

廖老师的教程实在太高深,没弄懂,点击打开链接

def deco_functionNeedDoc(func):
    if func.__doc__ == None :
        print func, "has no __doc__, it's a bad habit."
    else:
        print func, ':', func.__doc__, '.'
    return func
@deco_functionNeedDoc
def f():
    print 'f() Do something'
@deco_functionNeedDoc
def g():
    'I have a __doc__'
    print 'g() Do something'
f()
g()
print f
print g

这段代码打印结果如下:

<function f at 0x0238F930> has nodoc,
it‘s a bad habit.

<function g at 0x0238F8B0> : I have a doc .f() Do somethingg() Do something

<function f at 0x0238F930>

<function g at 0x0238F8B0>

当时我就晕菜了,想了很久,原来在@装饰器函数的时候就会调用装饰器,装饰器函数return func,而func就是传进去的参数f。这个时候把代码改改。


def deco_functionNeedDoc(func):
    if func.__doc__ == None :
        print func, "has no __doc__, it's a bad habit."
    else:
        print func, ':', func.__doc__, '.'
    def func_1(*args, **kw):
        print func.__name__,' : this is func_1'
    return func_1
@deco_functionNeedDoc
def f():
    print 'f() Do something'
@deco_functionNeedDoc
def g():
    'I have a __doc__'
    print 'g() Do something'
f()
g()
print f
print g

此时的打印结果:

<function f at 0x023CF930> has no __doc__, it‘s a bad habit.

<function g at 0x023CF8B0> : I have a __doc__ .

f  : this is func_1

g  : this is func_1

func_1

func_1

问题至此,应该很明了了~~只是,装饰器拿来干嘛呢??应用在什么情况下呢??待探索

最后再贴一个超级大团圆,太有意思了,这个不解释了,困了,理解了这个,估摸装饰器的基本原理就透彻了。

def deco_functionNeedDoc(func1):
    if func1.__name__ == "yyy" :
        print func1, "the func1 == yyy"
    else:
        print func1, ':', func1.__doc__, '.'

    def xxx() : # y + f + h + x
        func1() # y + f + h + f + h
        print "plus xxx"
        return func1() # y + f + h + f + h

    return xxx

def deco_functionNeedDocxxx(func2):
    if func2.__name__ == "hhh" :
        print func2, "the func2 == hhh"
    else:
        print func2, ':', func2.__doc__, '.'

    def yyy(): # y + f + h + f + h
        print "plus yyy"
        func2()  # f + h
        return func2() # f + h

    return yyy

def deco_functionNeedDochhh(func3):
    if func3.__name__ == "f" :
        print func3, "the func3 == f"
    else:
        print func3, ':', func3.__doc__, '.'

    def hhh() : # = f + h
        func3()  # = f
        print "plus hhh"
        return "Hello Wrold"
    return hhh

@deco_functionNeedDoc
@deco_functionNeedDocxxx
@deco_functionNeedDochhh
def f():
    print 'print original fff'

f()
print "------------"
print f
print "------------"
print f()

结果如下:

<function f at 0x109a2b938> the func3 == f

<function hhh at 0x109a2b9b0> the func2 == hhh

<function yyy at 0x109a2ba28> the func1 == yyy

plus yyy

print original fff

plus hhh

print original fff

plus hhh

plus xxx

plus yyy

print original fff

plus hhh

print original fff

plus hhh

------------

<function xxx at 0x109a2baa0>

------------

plus yyy

print original fff

plus hhh

print original fff

plus hhh

plus xxx

plus yyy

print original fff

plus hhh

print original fff

plus hhh

Hello Wrold

时间: 2024-10-06 23:33:09

Python装饰器有趣实例探究的相关文章

Python装饰器简单实例

#!/usr/bin/env python __author__ = '氨蛋三键' class Tracer: def __init__(self, fun): self.calls = 0 self.fun = fun def __call__(self, *args, **kwargs): self.calls += 1 print("Tracer 第 %s 次调用的函数是 %s " % (self.calls, self.fun.__name__)) self.fun(*args

Python装饰器详解,详细介绍它的应用场景

装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 mock.patch 函数注册 在任务中心注册一个任务 注册一个带信号处理器的函数 不同应用场景下装饰器实现 函数注册表 简单注册表 funcs = [] def register(func): funcs.append(func) return func @register def a(): r

python装饰器1

第八步:让装饰器带 类 参数 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.")   

【转】九步学习python装饰器

本篇日志来自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 纯转,只字未改.只是为了学习一下装饰器.其实现在也是没有太看明白,对于装饰器我就是用的时候找例子,能蒙对,但是用过之后一段时间就忘了.还是用的少.有空应该好好看一看的,包括闭包.对于各种现代编程语言来说闭包都是很重要的.在这里先谢过原作者,如有侵权请告知. =-=-=-=-=-=-=-=-=-=-一条不怎么华丽的分隔线-=-=-=-=-=-=-=-=-=-= 这

Python 装饰器的形成过程

装饰器  定义:本质是函数,(装饰其他函数),即为其他函数添加附加功能.  原则: 1.不能修改被装饰的函数的源代码:            2.不能修改被装饰的函数的调用方式. 实现装饰器知识储备:   1. 函数即'变量'           2. 高阶函数       a. 把一个函数名当作实参传递给另一个函数(在不修改被装饰函数源代码的前提下为其添加新功能)       b. 返回值中包含函数名(不修改函数的调用方式)   3. 嵌套函数 高阶函数 + 嵌套函数 (组成)--> 装饰器

python 装饰器及标准库functools中的wraps

最近在看 flask的视图装饰器 时,忽然想起预(复)习一下python的装饰器. 这里有一篇比较好的讲解装饰器的书写的 Python装饰器学习(九步入门) . 这里不单独记录装饰器的书写格式了,重点是工作流程. 首先常见的 装饰器 格式就是通过@语法糖,简便的写法,让流程有些不太清楚. 装饰器不带参数的情况下: def deco(func):     def _deco():         print("before myfunc() called.")         func(

Python 装饰器学习心得

最近打算重新开始记录自己的学习过程,于是就捡起被自己废弃了一年多的博客.这篇学习笔记主要是记录近来看的有关Python装饰器的东西. 0. 什么是装饰器? 本质上来说,装饰器其实就是一个特殊功能的函数,这个特殊的功能就是:装饰另一个函数.举一个最简单的例子来说: 1 def identify(f): 2 print 'Decorator identify called.' 3 return f 这里identify其实是一个装饰器,这个装饰器对输入的参数f不进行任何修饰,然后返回这个参数.其中的

深入浅出 Python 装饰器:16 步轻松搞定 Python 装饰器

Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都很相似--都是想要对一个已有的模块做一些"修饰工作",所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能)侵入到原有的模块中的代码里去.但是OO的Decorator简直就是一场恶梦,不信你就去看看wikipedia上的词条

python装饰器简介

在了解装饰器的之前一定要先了解函数作为参数传递, 什么是函数内嵌,请参考我之前写的博客函数简介 python装饰器思想有点类似设计模式的装饰模式, 其意图是动态地给函数对象添加额外的功能.比如像增加日志打印的功能,有点面向切面编程(AOP)的感觉. 装饰器语法 以@开头,接着后面跟着的是装饰器的名字和可选的参数.装饰器语法是一种语法糖. 格式如下 @decomaker(deco_args) def foo(func_opt_args) 可以组合,等价于foo = g(f(foo)) @g @f