python decorator的本质

推荐查看博客:python的修饰器

对于Python的这个@注解语法糖- Syntactic Sugar 来说,当你在用某个@decorator来修饰某个函数func时,如下所示:

@decorator
def func():
    pass

其解释器会解释成下面这样的语句:

func = decorator(func)

是的,上面这句话在真实情况下执行了。如果我们执行以下代码:

def fuck(fn):
    print "fuck %s!" % fn.__name__[::-1].upper()

@fuck
def wfg():
    print ‘abc‘

输出:

fuck GFW!

所以一般我们写修饰器,都是写一个二级函数,返回一个函数。例如下面代码:

def hello(fn):
    def wrapper():
        print "hello, %s" % fn.__name__
        fn()
        print "goodby, %s" % fn.__name__
    return wrapper

@hello
def foo():
    print "i am foo"

foo()

输出:

hello, foo
i am foo
goodby, foo

相当于执行

foo=hello(foo)
foo()
时间: 2024-08-05 02:11:44

python decorator的本质的相关文章

python decorator心得体会

python decorator心得体会 前言 用途 给方法添加新的功能 给类增加或者删除方法 参数化的decorator 更改方法的默认调用行为 2和3的整合 其实1和4可以归为一类特性,都是对现有方法的增强.** 前言 此小短文来源于qq群一位朋友的问题,问题如下: 下面这段代码的功能是什么? def log(func): def wrapper(*args, **kw): print 'call %s():' % func.__name__ return func(*args, **kw)

python命名空间的本质

Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则. 接下来我将分四部分揭示Python命名空间的本质:一.命名空间的定义:二.命名空间的查找顺序:三.命名空间的生命周期:四.通过locals()和globals() BIF访问命名空间 重点是第四部分,我们将在此部分观察命名空间的内容. 一.命名空间 Python使用叫做命名空间的东西来记录变量的轨迹.命名空间是一个 字典(dictionary) ,它的键就

python -- decorator && generator && iterator

python -- decorator && generator && iterator 一. decorator 1. 2. 二. generator 三. iterator 原文地址:https://www.cnblogs.com/-cjzsr-/p/8167923.html

python decorator 基础

转自:http://www.cnblogs.com/xybaby/p/6274187.html 一般来说,装饰器是一个函数,接受一个函数(或者类)作为参数,返回值也是也是一个函数(或者类).首先来看一个简单的例子: # -*- coding: utf-8 -*- 2 def log_cost_time(func): 3 def wrapped(*args, **kwargs): 4 import time 5 begin = time.time() 6 try: 7 return func(*a

Python decorator module

Python functool Python中的装饰器 def _memoize(func, *args, **kw): if kw: # frozenset is used to ensure hashability key = args, frozenset(kw.items()) else: key = args cache = func.cache # attribute added by memoize if key not in cache: cache[key] = func(*a

python decorator 进阶

转自:http://www.cnblogs.com/xybaby/p/6274283.html 上一篇文章开始的时候提到 "一般来说,装饰器是一个函数,接受一个函数(或者类)作为参数,返回值也是也是一个函数(或者参数)" 有一般情况,就有特殊情况.第一种特殊情况:装饰器可能也是一个类:第二种特殊情况:装饰器返回的对象的类型不一定等同于被装饰对象的类型. 对于第一种情况,我们知道对于任何callable的对象都可以进行调用(在对象名称后面使用小括号),callable对象的范围就比较广了

Python decorator装饰器

问题: 定义了一个新函数 想在运行时动态增加功能 又不想改动函数本身的代码 通过高阶段函数返回一个新函数 def f1(x): return x*2 def new_fn(f): #装饰器函数 def fn(x): print ('call ' + f.__name__ + '()') return f(x) return fn #方法1 g1 = new_fn(f1) print (g1(5)) #方法2 f1 = new_fn(f1) #f1的原始定义函数彻底被隐藏了 print (f1(5

heading python decorator

decorator make a wrapper function do something before and after the original function. The wrapper function share arguments with original function.@decorator is same with?func = decorator(func);?decorator receive func and return a wrapper func with s

Python Decorator分析

decorator本身是一个函数,这个函数的功能是接受被修饰的函数(decorated)作为参数,返回包装函数(wrapper)替换被修饰函数(decorated). @decorator func 等同于 func = decorator(func).大部分情况下wrapper函数必须要和decorated函数具有相同的参数,这样在wrapper函数中可以执行decorated函数,并增加一些拓展流程.基于此decorator的原则如下: 对于自定义decorator,wrapper函数的参数