修饰器学习

Posted thouger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修饰器学习相关的知识,希望对你有一定的参考价值。

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

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是修饰器的参数,第二层参数是传进被修饰函数,第三层没有参数

 

以上是关于修饰器学习的主要内容,如果未能解决你的问题,请参考以下文章

Python的wraps修饰器详解

TodoPython面试题分析记录(修饰器等)

Go的修饰器编程

Python有参/无参修饰器函数和修饰器类的用法

Python有参/无参修饰器函数和修饰器类的用法

python3修饰器简单理解