博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
闭包 装饰器 - 总结
阅读量:4984 次
发布时间:2019-06-12

本文共 3127 字,大约阅读时间需要 10 分钟。

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 
.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的装饰器

转载于:https://www.cnblogs.com/mazhen123456/p/8824811.html

你可能感兴趣的文章
k8s中解决容器时差问题
查看>>
程序员需要知晓的14大开发工具
查看>>
knockout中viewmodel跟子model相互调用
查看>>
【Java集合源码剖析】HashMap源码剖析
查看>>
Mesos源码分析
查看>>
刚刚加入博客
查看>>
Mysql
查看>>
struts整合dropzone.js上传图片遇到的点问题
查看>>
C语言 return没有返回值.
查看>>
sql server T-SQL高级查询
查看>>
javaweb学习总结(四十七)——监听器(Listener)在开发中的应用
查看>>
数据结构-二叉树笔记
查看>>
DRF框架--视图
查看>>
graph
查看>>
ES6学习笔记(一)-变量的解构赋值
查看>>
面向对象的五大基本原则
查看>>
手机访问 localhost
查看>>
Windows Live Writer配置步骤
查看>>
一些不错的博文分享
查看>>
smarty2 设置、变量、函数
查看>>