重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
装饰器原理:
装饰器是为了在不改变原函数的功能的同时给原函数增加一些新功能的函数叫做装饰器。
首先说一下简单的装饰器原理
def aa(): print('我就是一个简单的函数')我们如果再不改变这个函数的基础上添加一个新功能该怎么做?
我们只需要添加一个新函数来调用这个函数,然后在形函数上添加新功能就好了,例如
def decorate(fn): def inner(): print('这个是新加功能') return fn return inner() def aa(): print('我就是一个简单的函数') aa = decorate(aa) aa()输出结果为:
这个是新加功能 我就是一个简单的函数下面就看看更详细一点的装饰器
直接上代码,查看结果
def decorate(func): def inner(a,b): print('3 给函数添加一个求和的输出 {} {}'.format(a,b)) print('4 我要打印func函数', func) result = func(a,b) print('6 我要打印add函数', add) print('7 我要打印func函数', func) print('8 我要打印inner函数', inner) return result print('2 我要打印decorate函数',decorate) return inner @decorate def add(a,b): print('5 我要打印add函数', add) return a+b print('1 我应该是首个打印的') print('9 这是函数输出的结果',add(1,2))输出结果为:
2 我要打印decorate函数 decorate 1 我应该是首个打印的 3 给函数添加一个求和的输出 1 2 4 我要打印func函数 add 5 我要打印add函数 inner 6 我要打印add函数 inner 7 我要打印func函数 add 8 我要打印inner函数 inner 2 我要打印decorate函数 decorate 9 这是函数输出的结果 3过程分析
由上面的输出,我们可以看得出来,装饰器的执行顺序是,213456789;
那是因为@装饰器函数,然后相当于把函数add传给了装饰器,从而变成了add = decorate(add),这里调用了decorate函数把函数add传到了
装饰器内部,然后就打印了第二步,由于没有后续的调用,程序就在这里在inner处停滞等待被调用,而inner的实际指针已经指向了add函数
所以打我们打印func的时候输出的是add函数,并没有带locals,这里就不属于decorate的内部函数,而我们装饰器下面的add函数却已经成
为了inner的内部函数了,接下来的逻辑就是正常的函数执行逻辑了
#装饰器过程
@decorare+add --》decorate--》inner--》result=func 即 result=add--》
#调用过程
(新add)add(1,2)--》result(1,2)--》(被装饰函数add)add(1,2)--》输出结果
但是经过了装饰器这两个add只是同名而已
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。