摘要:在Python入门学习中,我们了解到闭包:如果在一个内部函数里,对在外部作用域的变量(不是全局作用域)进行引用,那边内部函数被称为闭包(closure)。装饰器:本质上是一个闭包函数。在不修改原函数的及其调用方式的情况下对原函数进行功能扩展。这个特点正好满足软件开发原则:开放封闭原则。学会之后让我们在Python入门学习中走的更远。
1. 介绍闭包
闭包:如果在一个内部函数里,对在外部作用域的变量(不是全局作用域)进行引用,那边内部函数被称为闭包(closure)
例如:如果在一个内部函数里:func2()就是内部函数,
对在外部作用域的变量进行引用:n就是被引用的遍历,n在外部作用域func里面被定义,而不是全局作用域
def func():
n = 10
def func2():
print('func2', n)
return func2
f = func()
f()
2. 介绍装饰器
装饰器:本质上是一个闭包函数。
功能:在不修改原函数的及其调用方式的情况下对原函数进行功能扩展。这个特点正好满足软件开发原则:开放封闭原则
练习:请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:
import time
import functools
def metric(fn):
@functools.wraps(fn)
def wrapper(*args, **kwargs):
start = time.time()
ret = fn(*args, **kwargs)
end = time.time()
print('%s executed in %s ms' % (fn.__name__, end - start))
return ret
return wrapper
@metric
def fast(x, y):
time.sleep(0.0012)
return x + y
@metric
def slow(x, y, z):
time.sleep(0.1234)
return x * y * z
f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
print('测试失败!')
elif s != 7986:
print('测试失败!')
3. 运用装饰器遵循开放封闭原则
开放:对拓展是开放的
为什么要对扩展开放呢?
我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
封闭:对修改是封闭的
为什么要对修改封闭呢?
就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。
装饰器完美的遵循了这个开放封闭原则。
例子:拷贝alex的网站登录
login_status = False
def login(func):
def login_inner(*args, **kwargs):
_user = 'alex'
_pwd = 'abc123'
global login_status
if login_status == False:
user = input('User Name:')
password = input('Password:')
if user == _user and password == _pwd:
login_status = True
print('成功登录...')
else:
print('用户名和密码错误')
else:
print('用户已经登录,验证通过')
if login_status:
func(*args, **kwargs)
return login_inner
def home():
print('---首页---')
def henan():
print('---河南专区---')
@login
def hebei(type):
print('---河北专区---', type)
hebei = login(hebei)
hebei("3p")
本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言Python频道!
擅长针对企业软件开发的产品设计及开发的细节与流程设计课程内容。座右铭:大道至简!
已有23人表明态度,87%喜欢该老师!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号