Python 装饰器简单示例

简单装饰器示例:

def servlet(func):
    print("into servlet")#1
    print(servlet)#2
    def foo():
        print("into foo")#7
        print(func)#8,真正的bar函数
        func()#9
        print("out foo")#13
    print(foo)#3
    print("out servlet")#4
    return foo
@servlet
def bar():
    print("in old bar")/#0
    print(bar)#11
    print("out old bar")#12
print(bar)#5,已经被装饰器装饰了
bar()#6

执行顺序如上,执行结果如下

into servlet
<function servlet at 0x00000186A1341E18>
<function servlet.<locals>.foo at 0x00000186A1801E18>
out servlet
<function servlet.<locals>.foo at 0x00000186A1801E18>
into foo
<function bar at 0x00000186A1801AE8>
in old bar
<function servlet.<locals>.foo at 0x00000186A1801E18>
out old bar
out foo

Process finished with exit code 0

可变参数装饰器示例:

def desc(func):
    print("in desc")
    print(desc)
    def foo(*arg1,**arg2):
        print("in foo")
        print(func)
        x = func(*arg1,**arg2)
        print("out foo")
        return x
    print(foo)
    print("out desc")
    return foo
@desc
def setArg1(x,y):
    print("in setArg1")
    print(setArg1)
    print("out setArg1")
    return x + y
@desc
def setArg2(x,y,z):
    print("in setArg2")
    print(setArg2)
    print("out setArg2")
    return x + y + z
print(setArg1)
print(setArg2)
x = setArg1(100,200)
y = setArg2(100,200,300)
print(x)
print(y)

代码如上,执行结果如下

in desc
<function desc at 0x0000024DF2611E18>
<function desc.<locals>.foo at 0x0000024DF2AD1E18>
out desc
in desc
<function desc at 0x0000024DF2611E18>
<function desc.<locals>.foo at 0x0000024DF2AD1EA0>
out desc
<function desc.<locals>.foo at 0x0000024DF2AD1E18>
<function desc.<locals>.foo at 0x0000024DF2AD1EA0>
in foo
<function setArg1 at 0x0000024DF2AD1AE8>
in setArg1
<function desc.<locals>.foo at 0x0000024DF2AD1E18>
out setArg1
out foo
in foo
<function setArg2 at 0x0000024DF2AD1A60>
in setArg2
<function desc.<locals>.foo at 0x0000024DF2AD1EA0>
out setArg2
out foo
300
600

Process finished with exit code 0

原文地址:http://blog.51cto.com/superhakce/2091351

时间: 2024-08-28 13:30:28

Python 装饰器简单示例的相关文章

python @装饰器 简单理解

个人学python 好久了,但是一直是这里挑点哪里挑点那样学,有点力不从心.最近又想看看装饰器怎么用,就又研究了一下下. 简单点的: #!/usr/bin/python def say(key):                              # 创建一个小函数 print 'your first love!' return key @say def hold(): print 'this is sercod world!' hold() 简单讲一下就是   @say def hol

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 装饰器、内部函数、闭包简单理解

python内部函数.闭包共同之处在于都是以函数作为参数传递到函数,不同之处在于返回与调用有所区别. 1.python内部函数 python内部函数示例: def test(*args): def add(*args): # 显示的调用外部函数的参数 return args return add(*args) # 返回内部函数的直接调用 运行结果如下: test(1,2,3) (1,2,3) 内部函数直接引用外部函数参数,外部函数test显示的返回内部函数add的调用.当需要在函数内部多次执行复

python 装饰器 一 (简单不带参数的函数)

#coding=utf-8 #python 装饰器 '''     装饰器可以用def的形式来定义.装饰器接收一个可调用对象作为输入参数, 并返回一个新的可调用对象. 装饰器新建了一个可调用对象,也就是return 返回的函数funx, 在新增的函数中,可以添加我们需要的功能,并通过调用原有函数来实现原有函数的功能 ''' def deco(func):     '''         无参数装饰器,func为被装饰的函数     '''     def _deco():         pri

简单回顾一下python 装饰器。

Python 装饰器(Decoratar)存在的意义就是再不改变原有函数的情况下,给函数增加功能. 直接通过代码以及相应的注释来展示. def fnname_dec(fn): def wapper(*args, **kwargs): # 为什么wapper 要接收参数呢. 因为被装饰后的函数其实就是wapper, # 然后要接受被装饰后的函数speak的参数供原来的speak函数使用来达到不影响原函数的功能. print("My name is " + fn.__name__) ret

python装饰器的简单理解

如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你的业务函数.或者类(人)最后把这顶帽子带在这个人头上 Python装饰器就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能. 这个函数的特殊之处在于它的返回值也是一个函数,这个函数是内嵌“原“”函数的函数. # 有两个已经实现的方法def f1(): p

Python装饰器由浅入深

装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们以装饰函数为例子介绍其用法.要理解在Python中装饰器的原理,需要一步一步来.本文尽量描述得浅显易懂,从最基础的内容讲起. (注:以下使用Python3.5.1环境) 一.Python的函数相关基础 第一,必须强调的是python是从上往下顺序执行的,而且碰到函数的定义代码块是不会立即执行它的,只

【转】九步学习python装饰器

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

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

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