题目:定义-一个计算函数运行时间的装饰器(计算时间使用time模块实现)
import time
def counttime(func):
def fun():
strattime = time.time()
print(strattime)
func()
endtime = time.time()
print(endtime)
print('耗时为.{}',endtime-strattime)
return fun
@counttime
def add():
c = 0
for i in range(10000000):
c += i
print(c)
add()
编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
以文档的形式的形式读取用户信息
user.txt格式如下:
{"user":"joker","pwd":"python","token":False}
装饰器函数如下:
with open('user.txt') as f:
users = eval(f.read())
def login_check(func):
def check():
while not users['token']:#判断token是否为False
user = input("账号:")
password = input("密码:")
if users.get('user') == user and users.get('pwd') == password:
users['token'] = True
func()#调用被装饰器的函数
break
else:
print('账号或密码错误')
else:
func()#直接调用被装饰的函数
return check
@login_check
def index():
print('index')
@login_check
def page1():
print('page1')
@login_check
def page2():
print('page2')
if __name__ == '__main__':
index()
page1()
page2()
通过装饰器实现单例模式,只要任意一个类使用该装饰器装饰,那么就会变成一一个单例模式的类。
def single(func):
isinstance = {}
def fun(*args,**kwargs):
if func in isinstance:
return isinstance[func]
else:
isinstance[func] = func(*args,**kwargs)
return isinstance[func]
return fun
@single
class A():
pass
a = A()
b = A()
print(id(a))
print(id(b))
使用字典的形式来保存实例化的对象信息,当多个类使用时,便于进行统一管理。在fun中判断是否存在对应的数据信息。
通过类实现一个通用的装饰器,既可以装饰函数也可以装饰器类,既可以装饰器有参数的,又可以装饰器无参数的
class Decorator():
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
print("This is Decator")
self.func( *args, **kwargs)
@Decorator
def test1(a):
print("This is test1 {}".format(a))
test1(3)
类作为装饰器时,首选会将test1信息传入类Decator中,即Decator(test1),该方法为类的实例方法__init__,装饰后调用test1方法时,实际是调用类中的__call__方法。