闭包函数与装饰器

八.闭包函数:定义在函数内部的函数,并且该函数包含对外部函数作用中名字的引用,该函数就称为闭包函数
闭:指的是定义在函数内部的函数
作用域关系:在函数定义阶段就规定死了,与调用位置无关
def outter():
	x=2
	def inner():
		#x=1
		print('from inner',x)

	return inner
f=outter()  #f=inner
f()

def foo():
	x=111111111  #调用阶段赋不生效 函数体值在定义阶段生效
	f()
foo()

应用场景:
import requests
import time
def outter(url):
    #url='https://www.baidu.com'
    def get():
        response=requests.get(url)
        if response.status_code == 200:
            print(response.text)
    return get

baidu=outter('https://www.baidu.com')
time.sleep(3)

baidu()


九.无参装饰器
装饰器即在不修改被装饰的对象源代码与调用方式的前提下,为装饰器对象的添加新功能
装饰器与被装饰的对象均可以是任意可调用的对象
装饰器==>函数
被装饰的对象==>函数

import time
def index():
	time.sleep(3)
	print('welcome to index page')

def home(name):
	time.sleep(5)
	print('welcome %s to home page' %name)

def outter(func): #func=最原始的index   outter函数就是装饰器
	def wrapper():  #func=index
		start_time=time.time()
		func()  #func()=index()
		stop_time = time.time()
		print('run time is %s' %(stop_time - start_time))
	return wrapper


index=outter(index)  #新的index=wrapper
index()

有无参装饰器之返回值
import time
def index(): #无参
	time.sleep(3)
	print('welcome to index page')
	return 123456789

def home(name):  #有参
	time.sleep(5)
	print('welcome %s to home page'%name)

#####################装饰器##############
def timmer(func):
	def wrapper(*args,**kwargs):  #有参无参 都可以传值
		start_time = time.time()
		res=func(*args,**kwargs)  #最原始的index()
		stop_time = time.time()
        print('run time is %s'(stop_time - start_time))
        return res  #返回最原始的index()的返回值
    return wrapper

index=timmer(index)
home=timmer(home)

index()
home('zhang')


装饰器的语法:
import time
def outer(func):  
	def inner(*args,**kwargs): #装饰器的参数
		start_time = time.time()
		res=func(*args,**kwargs)  #被装饰的函数
		stop_time = time.time()
		 print('run time is %s'(stop_time - start_time))
		return res
	return inner
@outer	#index=outer(index)
def index():
	time.sleep(3)
	print('welcome to index page')
	return 123456789

@outer  #home=outer(home)
def home(home)
	time.sleep(5)
	print('welcome %s to home page'%name)

index()
home('zhang')

#认证装饰器案例:
import time
current_user={
	'username':None,
}
def auth(func):
	def wrapper(*args,**kwargs):
		if current_user['username']:  #None的布尔值一定为假 如果里面有值就一定为真
			print('已经登录过')
			res=func(*args,**kwargs)  #如果已经登录过 直接返回值给res 
			return res

		username=input('用户名>>>:').strip()
		pwd=input('密码>>>:').strip()
		if username == 'zhang' and pwd = '123':
			print('登录成功')
			res=func(*args,**kwargs)
			return res
		else:
			print('用户或密码错误')
	return wrapper

@auth  #index=auth(index)
def index():
	time.sleep(1)
	print('welcome to index page')
	return 122
@auth  #home=auth(home)
def home(home):
	time.sleep(2)
	print('welcome %s to home page'%name)

index()
home('zhang')

#叠加装饰器
import time
current_user={
    'username':None,
}

def auth(func):
    #func=index
    def wrapper(*args,**kwargs):
        if current_user['username']:  #None的布尔值为假 如果有值 一定为真
            print('已经登录过')
            res=func(*args,**kwargs)
            return res

        username=input("用户名>>:").strip()
        pwd=input("密码>>:").strip()
        if username == 'egon' and pwd == '123':
            print('登录成功')
            current_user['username']=username
            res=func(*args,**kwargs)
            return res
        else:
            print('用户名或密码错误')
    return wrapper

def timmer(func):
    def wrapper(*args,**kwargs):   #以什么形式传参就以什么形式返回值
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print(stop_time-start_time)
        return res
    return wrapper

@timmer  #统计的是auth+index的执行时间 跟装饰器的位置有关
@auth  #index=auth(index)
def index():
    time.sleep(1)
    print('welcome to index page')
    return 122

index()

有参装饰器:
import time
current_user={
    'username':None,
    # 'login_time':None
}

def auth(engine):
    # engine='file'
    def auth2(func):
        # func=index
        def wrapper(*args,**kwargs):
            if engine == 'file':
                if current_user['username']:
                    print('已经登陆过了')
                    res=func(*args,**kwargs)
                    return res

                uname=input('用户名>>: ').strip()
                pwd=input('密码>>: ').strip()
                if uname == 'zhang' and pwd == '123':
                    print('登陆成功')
                    current_user['username']=uname
                    res=func(*args,**kwargs)
                    return res
                else:
                    print('用户名或密码错误')
            elif engine == 'mysql':
                print('基于MyQL的认证')
            elif engine == 'ldap':
                print('基于LDAP的认证')
        return wrapper
    return auth2

@auth('file') #@auth2 #index=auth2(index) #index=wrapper  解释器遇到括号里面的先执行
def index():
    time.sleep(1)
    print('welcome to index page')
    return 122


index() # wrapper()

  

posted @ 2018-09-25 02:07  人生信条~~  阅读(118)  评论(0编辑  收藏  举报