您的位置:首页 > 编程语言 > Python开发

Py修行路 python基础 (十)装饰器

2017-04-10 20:02 27 查看

装饰器

一、定义

    装饰器:顾名思义,就是对某个东西起到装饰修饰的功能。

python中的装饰器,其本质上就是一个python函数,它可以让其他函数不需要任何代码变动的前提下增加额外功能。通俗理解就是 函数 闭包 的实用。

二、语法及注意事项

  1、书写规范 @ *** ***指装饰器的函数名

  2、装饰器作为一个函数,他会把其下一行的主函数名作为变量,传递到自己的函数去调用。再重新赋值主函数。

  3、装饰器必须放到被装饰的函数上边,并且独占一行;多个装饰器下 ,按照先下后上执行。

三、为什么要用装饰器?

开放封闭原则

源代码上线之后,主函数的定义和调用方式尽量避免更改。装饰器本身在源代码中就是可调用的对象。

四、装饰器使用举例

原函数如下:

import time
def index():
time.sleep(3)
print("welcome to oldboy")
index()

执行结果:

welcome to oldboy

在原函数不被更改的情况下,增加新的功能:计算主函数执行的时间!

1、最原始的无参装饰器(无位置参数)。

import time

def timer(func):
def wrapper():
start_time=time.time()
func()
stop_time = time.time()
print("running time:%s"%(stop_time-start_time))
return wrapper
@timer
def index():
time.sleep(3)
print("welcome to oldboy")
index()

#多个装饰器调用!
#1、加上了统计函数的执行时间
#2、加上了认证功能,为避免重复登录认证,执行功能完成之后再判断登录状态。已登录则跳过,第一次登录会有登录信息的认证。

import time
current_login={'name':None,'login':False}

def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)  #my_max(1,2)
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return res
return wrapper

def auth2(auth_type='file'):
def auth(func):
# print(auth_type)
def wrapper(*args,**kwargs):
if current_login['name'] and current_login['login']:
res=func(*args,**kwargs)
return res
if auth_type == 'file':
name=input('username: ')
password=input('password: ')
if name == 'zhejiangF4' and password == 'sb945':
print('auth successfull')
res=func(*args,**kwargs)
current_login['name']=name
current_login['login']=True
return res
else:
print('auth error')
elif auth_type == 'sql':
print('还他妈不会玩')
return wrapper
return auth

@timmer
@auth2(auth_type='file') #@auth  #index=auth(index)
def index():
print('welcome to inex page')

@auth2()
def home():
print('welcome to home page')

#调用阶段
index()
home()
View Code 执行结果如下:

username: zhejiangF4
password: sb945
auth successfull
welcome to inex page
run time is 10.760615348815918
welcome to home page

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: