这篇文章给大家分享的是有关Python高级特性之闭包与装饰器的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
具体如下:
闭包
1.函数参数:
(1)函数名存放的是函数的地址
(2)函数名()存放的是函数内的代码
(3)函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候,就是引用传递
def func01():
print("func01 is show")
test = func01
print(func01)
print(test)
test()
结果:
2.闭包:
(1)内层函数可以访问外层函数变量
(2)闭包就是一个嵌套定义的函数,在外层运行时才开始内层函数的定义,然后将内部函数的引用传递函数外的对象(闭包外层函数的返回值为内层函数名)
(3)内部函数和使用的外部函数提供的变量构成的整体称为闭包
def func_out(rate):
def func_in(money):
print(rate * money)
return func_in
usa_money = func_out(0.7)
usa_money(100)
usa_money(200)
执行结果:
装饰器
装饰器就是在不改变函数的原有代码的前提下 给函数添加新的功能,装饰器一般是一个闭包。
1.装饰器:
# 在不改变函数的原有代码的前提下 给函数添加新的功能
def func_out(func):
def func_in():
print("验证")
func()
return func_in
@func_out
def login():
print("登录")
# 有装饰器 装饰器下面正好是一个函数
# login = func_out(login) 重点
login()
如果@func_out装饰器下刚好是一个login函数,会执行:
login = func_out(login)
所以会直接执行func_out内的代码,func为原login,即指向原login函数的地址空间并且返回内层函数名,即:
login = func_out(login) = func_in
所以login()的执行结果为func_in(),即:
print('验证')
func() # func指原login函数的地址
就实现了不改变原函数的情况下给函数添加新功能
执行结果:
2.装饰有返回指函数:
def func_out(func):
def func_in():
# ret = func()
# def login():
# return 100
return func()
return func_in
@func_out
def login():
return 100
# login() ==> func_in()
# func ==> 原始的login
f = login()
print(f)
3.装饰有参数函数:
def func_out(func):
def func_in(a):
func(a)
return func_in
@func_out
def login(a):
print(a)
# login() ==> func_in()
# func ==> 原始的login
login(10)
4.装饰器通用版:
def func_out(func):
def func_in(*args,**kwargs):
return func(*args,**kwargs)
return func_in
@func_out
def login(*args,**kwargs):
print(args)
print(kwargs)
# login() ==> func_in()
# func ==> 原始的login
login(10,20,age = "17",name="123")
5.类装饰器:
class Foo(object):
def __init__(self, func):
self.func = func
def __call__(self):
print("验证")
self.func()
@Foo
def login():
print("登录")
# login = Foo(login)
login()
6.多装饰器:
def func_out01(func01):
print("func_out01 is show")
def func_in01():
print("func_in01 is show")
func01()
return func_in01
def func_out02(func02):
print("func_out02 is show")
def func_in02():
print("func_in02 is show")
func02()
return func_in02
@func_out02 # login = func_out02(login)
@func_out01 # login = func_out01(login)
def login():
print("login is show")
login()
执行结果:
因为@闭包名下为函数时才会实现装饰器,所以func_out1会先装饰函数,func_out2会后装饰函数,所以外层函数先执行func_out1,后执行func_out2;因为func_out1先装饰函数,func_out2后装饰函数,所以func_out1装饰后,原函数为先输出func_in1内的语句,再输出原login,然后func_out2装饰后,执行顺序为先输出func_in2的语句,再输出装饰后的login函数,即:func_in2——func_in1——login。
7.给装饰器传递函数:
def route(参数):
print(参数)
def func_out(func):
def func_in():
func()
return func_in
return func_out
@route(参数)
def index():
return "index is show"
感谢各位的阅读!关于“Python高级特性之闭包与装饰器的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。