python学习笔记(二十七)-- 装饰器

装饰器:不改变原来函数的代码和调用方式,给函数添加新功能。
装饰器,本身也是一个函数
添加装饰器格式 @函数名
加上装饰器后,就可以扩展没有的功能,比如说打印函数名、运行时间等,就不用写重复的代码
#给函数加上打印函数名的功能
def func_name(func):
    def f(*args,**kwargs):
        print("[DEBUG]:Enter the function %s()"%(func.__name__))
        func(*args,**kwargs)
    return f

# 给函数打印运行时间
def timer(func):
    import time
    def f(*args,**kwargs):#带参数
        start_time = time.time()
        result = func(*args,**kwargs) #获取函数返回值
        run_time = time.time() - start_time
        print("函数 %s() 运行时间是 %s"%(func.__name__,run_time))
        return result #return函数返回值
    return f

# 带返回值的函数
@timer
def sum(a,b):
    return a+b

@timer
def say(name,count):
    print('%s hello! %s'%(name,count))

say('nana',5)
result = sum(2,5)
print("sum函数的返回值是%s"%result)

 例子:判断是否登陆的装饰器

import os

def login():
    username = input("请输入用户名")
    password = input("输入密码")
    if username == 'nn' and password == '123':
        with open(username,'a+') as fw:
            return True #走到这里就为真
    return False #不然就为假

def is_login(func):
    def new_func(*args,**kwargs):
        username = args[0]
        if os.path.exists(username):#如果登陆成功这个文件会被创建,所有判断存在与否
            result = func(*args,**kwargs)
            return result
        else:
            if login():
                result = func(*args,**kwargs)
                return result
            else:
                print("登陆失败,重新登录!")
    return new_func

@is_login
def buy(username):
    print("购买")

buy('nana')
原文地址:https://www.cnblogs.com/yanyan-/p/11082185.html