练习题及答案(装饰器)

题目:定义-一个计算函数运行时间的装饰器(计算时间使用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__方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值