修饰器学习

第一步:(简单的函数调用)

def myfunc()

print(‘myfunc() called.")

myfunc()

第二步:(修饰器本质的调用原理,修饰器内调用被修饰的函数)

def deco(func):
    print(‘before myfunc() called.‘)
    func()
    print(‘after myfunc() called‘)

def myfunc():
    print(‘myfunc() called‘)

myfunc=deco(myfunc)#最重要的一步,修饰器就是一个函数,一个容器,用来放进其他函数修饰,改变,在函数前后添加内容的

第三步:最简单的修饰器(相当于“myfunc = deco(myfunc)”)

def deco(func):
    print(‘before myfunc() called.‘)
    func()
    print(‘after myfunc() called.‘)
    return func

@deco
def myfunc():
    print(‘myfunc() called‘)

第四步:内嵌包装函数(保护函数)

def deco(func):
    def _deco():
        print(‘before myfunc() called.‘)
        func()
        print(‘after myfunc() called.‘)
    return _deco

@deco
def myfunc():
    print(‘myfunc() called‘)

myfunc()

第五步:被修饰的函数有参数

修饰器第二层函数需要有被修饰函数的参数,并且第二层返回被修饰函数运行后的值,被修饰函数也要返回值

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)

第六步:被修饰的函数不确定数量(使用*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)
myfunc2(1,2,3)

总的来说,就是把修饰器第二层的固定参数,改为(*args,**kwargs),被修饰函数就可以接受不确定数量的参数了

第七步:带参数的修饰器,使修饰器更灵活,可控,参数可控制这个函数的作用,和特征

def deco(args):
    def _deco(func):
        def __deco():
            print(‘before %s called [%s].‘ % (func.__name__,args))
            func()
            print(‘after %s called [%s]‘ % (func.__name__,args))
        return __deco
    return _deco

@deco(‘module1‘)
def myfunc():
    print(‘myfunc() called‘)

@deco(‘module2‘)
def myfunc2():
    print(‘myfunc2() called‘)

myfunc()
myfunc2()

解析:如果修饰器带有参数,那么修饰器需要三层,第一层,args是修饰器的参数,第二层参数是传进被修饰函数,第三层没有参数

时间: 2024-12-18 01:24:25

修饰器学习的相关文章

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 # -*- codin

ES6学习笔记九:修饰器

一:修饰器(Decorator)是一个函数,用来修改类的行为. 1)定义与使用 function 修饰器名(target) { //target是被修饰对象,可用target.xxx进行调用修改 } @修饰器名 class MyClass { // ... } //调用修饰器 MyClass.修饰器; 修饰器对类的行为的改变,是代码编译时发生的,而不是在运行时.这意味着,修饰器能在编译阶段运行代码. 2)带参数的修饰器 function 修饰器名(参数列表) { return function(

Python的wraps修饰器详解

本文和大家分享的主要是python 中wraps 修饰器相关内容,一起来看看吧,希望对大家 学习python有所帮助. 在了解  wraps  修饰器之前,我们首先要了解  partial  和  update_wrapper  这两个函数,因为在 wraps  的代码中,用到了这两个函数. partial 首先说  partial  函数,在  官方文档  的描述中,这个函数的声明如下:  functools.partial(func, *args, **keywords)  .它的作用就是返

Decorator [?dek?re?t?(r)] 修饰器/装饰器 -- 装饰模式

装饰模式 -- 原先没有,后期添加的属性和方法 修饰器(Decorator)是一个函数,用来修饰类的行为.这是ES7的一个提案,目前Babel转码器已经支持. 需要先安装一个插件: npm install babel-plugin-transform-decorators-legacy --save-dev 然后在项目根目录下,找到:.babelrc => 修改为 "plugins": ["transform-runtime","transform-

谈谈python修饰器

前言 对python的修饰器的理解一直停留在"使用修饰器把函数注册为事件的处理程序"的层次,也是一知半解:这样拖着不是办法,索性今天好好整理一下关于python修饰器的概念及用法. 介绍 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 功能 我们首先从一个简单的例子

python 修饰器

因困扰自己多时,打算整理一下修饰器到底是什么? 参考资料:http://python.jobbole.com/82344/ 修饰器 1. 定义2个函数 2. 基本实现 3. 问题:实现后, 要修改原来代码中的变量名, funcB()改为funcA(funcB) 4. 解决方法:让funcB赋值等于funcA(funcB),用时就是funcB(), 不用修改原来代码, 这个要求需funcA(funcB)返回的是一个函数     a) 所以要返回一个函数,则加一个函数 wrapper(),然后ret

PYTHON修饰器的函数式编程

转自:http://coolshell.cn/articles/11265.html Python修饰器的函数式编程 Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都很相似--都是想要对一个已有的模块做一些"修饰工作",所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能

ES2017中的修饰器Decorator

前面的话 修饰器(Decorator)是一个函数,用来修改类的行为.本文将详细介绍ES2017中的修饰器Decorator 概述 ES2017 引入了这项功能,目前 Babel 转码器已经支持Decorator 首先,安装babel-core和babel-plugin-transform-decorators.由于后者包括在babel-preset-stage-0之中,所以改为安装babel-preset-stage-0亦可 $ npm install babel-core babel-plug

Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器

Python的迭代器. 生成器和修饰器 1. 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退. 优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而在这之前或者之后,元素可以不存在或被销毁. 特点: 访问者是不需要关心迭代器内部的结构,仅需要通过next()方法不断去取下一个内容. 不能随机访问集合中的某个值,只能从头到尾依次访问. 访问到一半时不能往回退 便于循环比较大的数据集合,节省内存 1 names = iter(['alex','ja