码迷,mamicode.com
首页 > 其他好文 > 详细

闭包 装饰器 - 总结

时间:2018-04-14 00:35:42      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:语法   登录   strip()   glob   软件开发   参数   put   login   ica   

1.闭包:
函数内部的子函数返回,在外部调用子函数时,其实函数已经结束,但是在调用子函数时,函数内部的局部变量任然有效。

技术分享图片
 1 def fun():
 2     n = 10
 3     def fun1():
 4         print(‘n为:‘, n)
 5     return fun1
 6 
 7 f = fun()
 8 print(f)
 9 f()
10 
11 <function fun.<locals>.fun1 at 0x000001DF0E6DFA60>
12 n为: 10
技术分享图片

--------------------------------------------------

2.装饰器:
参考:http://www.cnblogs.com/alex3714/articles/5765046.html

软件开发的一个原则:开放-封闭 原则
    开放:对现有功能的扩展开放
    封闭:已实现的功能代码块不应该被修改

------------------

# 对河南和欧美专区认证,若是已经登录过,就不需要在登录。

# 2.1.语法糖 装饰器 

user_state = False
def login(func):
def inner():
_username = ‘alice‘
_password = ‘123‘
global user_state
if user_state == False:
username = input(‘username:‘).strip()
password = input(‘password:‘).strip()

if username == _username and password == _password:
print(‘welcome to login...‘)
user_state = True
else:
print(‘wrong username or password‘)
else:
print(‘用户已经登录,认证通过‘)
if user_state == True:
func()
return inner

def home():
print(‘-----首页-----‘)
@login # america=login(america)
def america():
print(‘-----欧美专区-----‘)

def japan():
print(‘-----日韩专区-----‘)
@login # henan=login(henan)
def henan():
print(‘-----河南专区-----‘)

home()
henan()
america()

-----首页-----
username:alice
password:123
welcome to login...
-----河南专区-----
用户已经登录,认证通过
-----欧美专区-----

语法糖 装饰器

# 2.2.带参数的装饰器

user_state = False
def login(func):
def inner(*args, **kwargs):
_username = ‘alice‘
_password = ‘123‘
global user_state
if user_state == False:
username = input(‘username:‘).strip()
password = input(‘password:‘).strip()

if username == _username and password == _password:
print(‘welcome to login...‘)
user_state = True
else:
print(‘wrong username or password‘)
else:
print(‘用户已经登录,认证通过‘)
if user_state == True:
func(*args, **kwargs)
return inner

def home():
print(‘-----首页-----‘)
@login
def america():
print(‘-----欧美专区-----‘)
@login
def japan(x, y, z=5):
print(‘-----日韩专区-----‘, x, y, z)
@login
def henan(x):
print(‘-----河南专区-----‘, x)

home()
henan(‘haha‘)
america()
japan(‘japan‘, 1, z=7)

-----首页-----
username:alice
password:123
welcome to login...
-----河南专区----- haha
用户已经登录,认证通过
-----欧美专区-----
用户已经登录,认证通过
-----日韩专区----- japan 1 7

带参数的装饰器

# 2.3.带参数2的装饰器

user_state = False

def login(auth_type):
def outer(func):
def inner(*args, **kwargs):
_username = ‘alice‘
_password = ‘123‘
global user_state
if user_state == False:
username = input(‘username:‘).strip()
password = input(‘password:‘).strip()

if username == _username and password == _password:
print(‘welcome to login...‘)
user_state = True
else:
print(‘wrong username or password‘)
else:
print(‘用户已经登录,认证通过‘)
if user_state == True:
func(*args, **kwargs)
return inner
return outer

def home():
print(‘-----首页-----‘)
@login(‘wx‘)
def america():
print(‘-----欧美专区-----‘)
@login(‘wb‘)
def japan(x, y, z=5):
print(‘-----日韩专区-----‘, x, y, z)
@login(‘qq‘) #henan = login(‘qq‘)(henan) =inner
def henan(x):
print(‘-----河南专区-----‘, x)

home()
# xx = login(‘qq‘)
# henan = xx(henan)
henan(‘haha‘)
america()
japan(‘japan‘, 1, z=7)

-----首页-----
username:alice
password:123
welcome to login...
-----河南专区----- haha
用户已经登录,认证通过
-----欧美专区-----
用户已经登录,认证通过
-----日韩专区----- japan 1 7

带参数2的装饰器

闭包 装饰器 - 总结

标签:语法   登录   strip()   glob   软件开发   参数   put   login   ica   

原文地址:https://www.cnblogs.com/mazhen123456/p/8824811.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!