代码改变世界

小白成长之路:初识python(五) --python装饰器

2017-10-29 11:57  张小贤TT  阅读(238)  评论(0编辑  收藏  举报
flag = "=======================装饰器============================="
#定义的装饰器函数
# def outer(func):
# def inner():
# print('加装饰器')
# r = func()
# return r
# return inner
#
# @outer
# def f1():
# print('原函数')

"""
关于python的装饰器,其本质也是也一个函数,其参数是一个函数名,作用是在不改变其他函数的代码的前提下,
为其他函数添加功能
装饰器的本质是把要增加功能的函数作为函数的参数传入装饰器函数,并接受其返回值,本质是已经改变了原来
的函数指向的内存地址,但是在装饰器函数内部仍然会执行原来函数的功能
具体格式如下:
@outer
def f1():
pass
其中outer为装饰器函数,其下面的是要修饰的函数
下面进行更具体的解析:
"""

def outer(func):
def inner():
print('加装饰器')
r = func()
return r
return inner

@outer
def f1():
print('原函数')
# print(f1)
# f1()
#先看一下效果,在注释掉@outer的时候执行f1()的时候得到的结果是
# 原函数
# # 添加装饰器之后得到的是
# 加装饰器
# 原函数
"""
我们先来看装饰器函数,在器内部定义了一个inner函数,在函数从上到下执行的过程中
先将outer函数放入内存,此时的inner函数还没有放入内存,继续往下执行,通过@outer
对f1进行装饰,也就是执行 f1 = outer(f1),此时的f1的指向已经发生了改变,即f1指
向outer函数内部的inner函数,可以通过print(f1)进行测试
# <function f1 at 0x00000196D3AA49D8>
# <function outer.<locals>.inner at 0x000002A0D4704AE8>

此时在执行f1()的时候已经相当于执行inner函数了,那么原来的f1去了哪里了?在执行
f1 = outer(f1) 的时候,outer函数的形参func指向f1,在inner函数的内部会执行
func函数,这也就是为什么f1的指向已经改变了为什么该能执行一次原来的f1的原因了
"""

##下面说说带参数的把
"""
f1(),inner(),func()三者的关系如果理解了,那么参数的问题就很容易了
不管加没加装饰器,函数名都是f1,只不过是函数名指向的内存地址发生了变化,
那么在没加装饰器之前,调用f1(1,2) --假设是有两个参数,为了在加了装饰器之后调用
f1(1,2) --(因为此时的实质是调用inner(1,2))不报错,那么inner函数必须有
和原函数一样的形参

"""
def outer(func):
def inner(a,b):
print('加装饰器')
r = func(a,b)
return r
return inner

@outer
def f1(a,b):
print(a,b)

f1(1,2)

"""
万能参数也是一样的道理,只不错参数变成了 *args,**kwargs
"""

def outer(func):
def inner(*args,**kwargs):
print('加装饰器')
r = func(*args,**kwargs)
return r
return inner

@outer
def f1(*args,**kwargs):
print("使用万能参数")