装饰器

# 装饰器
# 为什么要用装饰器及开放封闭原则
# 一旦代码上线使用了,就要遵守开放封闭原则。代码相关的不允许随便改。
# 由于原代码不能随便改,同时要增加新的功能,就要用装饰器

# 什么是装饰器(本质是函数)
# 原代码:
# def index():
#     print('welcome to boy')
#
# index()

# 我想打印'welcome to boy'后打印时间,但不能动原代码

# import time
# def timmer(aa):
#     def bb():
#          # aa=最原始的index  bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
#         print(aa)
#         start_time=time.time()
#         aa()
#         stop_time=time.time()
#         # 统计运行时间
#         print("run time is %s" %(stop_time-start_time))
#     return bb

# @就是在下面函数上加装饰器
# index=timmer(index) # index是函数名字,timmer是装饰器名字
# @timmer
# def index():
#     time.sleep(3)
#     print('welcome to oldboy')
#
# index()

# import time
# def timmer(aa):
#     def bb(name):
#          # aa=最原始的index  bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
#         print(aa)
#         start_time=time.time()
#         aa(name)
#         stop_time=time.time()
#         # 统计运行时间
#         print("run time is %s" %(stop_time-start_time))
#     return bb
#
# @timmer
# def abc(name):
#     time.sleep(3)
#     print('welcome to oldboy')
#
# abc("jensen")

# 由于还些函数有参数,有些没,参数个数不一定样,需要用*args,**kwargs
# import time
# def timmer(aa):
#     def bb(*args,**kwargs):
#          # aa=最原始的index  bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
#         print(aa)
#         start_time=time.time()
#         aa(*args,**kwargs)
#         stop_time=time.time()
#         # 统计运行时间
#         print("run time is %s" %(stop_time-start_time))
#     return bb
#
# # @就是在下面函数上加装饰器
# # index=timmer(index) # index是函数名字,timmer是装饰器名字
# @timmer
# def index():
#     time.sleep(3)
#     print('welcome to oldboy')
#
# index()
#
# @timmer
# def abc(name):
#     time.sleep(5)
#     print('welcome to %s' %name)
#
# abc("jensen")

# 外部命令有返回值的话,需要在装饰器内部也要有返回值
import time
def timmer(aa):
    def bb(*args,**kwargs):
         # aa=最原始的index  bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
       
print(aa)
        start_time=time.time()
         # ff要接收aa()是返回值
       
ff=aa(*args,**kwargs)
        stop_time=time.time()
        # 统计运行时间
       
print("run time is %s" %(stop_time-start_time))
        return ff
    return bb

@timmer
def my_max(x,y):
    print('my_max function:')
    res=x if x>y else y
    return res

res=my_max(1,2)
print('=====>',res)

===================有参装饰器

# 有参装饰器
def auth2(auth_type):
    def auth(func):
        # print(auth_type)
       
def wrapper(*args,**kwargs):
            if auth_type=='file':
                name=input('姓名:')
                passwd=input('密码:')
                if name=='xie' and passwd=='123':
                    print("成功认证")
                    res=func(*args,**kwargs)
                    return res
                else:
                    print("认证不成功")
            elif auth_type=='sql':
                print('错误')
        return wrapper
    return auth

# index=auth(index)
#
无参函数默认本地文件,如果不是本地,就要有参函数
@auth2(auth_type='file')
def index():
    print('welcome to inex page')

index()

# 输入一次用户名密码,下次调用不用再输入
import time
login={'name':None,'pwd':False}

def timmer(xie):
    def bb(*args,**kwargs):
         # aa=最原始的index  bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
       
start_time=time.time()
         # ff要接收aa()是返回值
       
ff=xie(*args,**kwargs)
        stop_time=time.time()
        # 统计运行时间
       
print("run time is %s" %(stop_time-start_time))
        return ff
    return bb

def bb2(auth_type='file'):
    def bb(xie):
            def rr(*args,**kwargs):
                if login['name'] and login['pwd']:
                    res=xie(*args,**kwargs)
                    return res
                if auth_type == 'file':
                    name=input("输入用户名:")
                    passwd=input("输入密码:")
                    if name=='xie' and passwd=='123':
                        res=xie(*args,**kwargs)
                        login['name']=name
                        login['pwd']=True
                        return
res
                    else:
                        print("错误")
                elif auth_type == "sql":
                    print("很香")
            return rr
    return bb

@timmer
@bb2(auth_type="file")
def aa():
    print("苹果")

@bb2(auth_type="file")
def cc():
    print("香蕉")


aa()
cc()


# 先aaa,再bbb,再ccc
# @ccc
# @bbb
# @aaa
# def func():
#     pass

# 读文件的用户名密码
# login={'name':None,'login':False}
#
# with open('username','w') as f:
#     f.write(str(login))

with open('username','r') as f:
    x=f.read()
    print(x)

print(eval(x)['name'])

return 函数返回内存地址

把函数注释放到装饰器中

# 输入一次用户名密码,下次调用不用再输入
import time
from functools import wraps

# 要输出程序解释:我的小房子,就要用语句 from functools import wraps再加上@wraps(xie)

login={'name':None,'pwd':False}

def timmer(xie):
    # @wraps(xie)
   
def bb(*args,**kwargs):
        '我的衣服'
         # aa=最原始的index  bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
       
start_time=time.time()
         # ff要接收aa()是返回值
       
ff=xie(*args,**kwargs)
        stop_time=time.time()
        # 统计运行时间
        
print("run time is %s" %(stop_time-start_time))
        return ff
    return bb

def bb2(auth_type='file'):
    def bb(xie):
            @wraps(xie)
            def rr(*args,**kwargs):
                if login['name'] and login['pwd']:
                    res=xie(*args,**kwargs)
                    return res
                if auth_type == 'file':
                    name=input("输入用户名:")
                    passwd=input("输入密码:")
                    if name=='xie' and passwd=='123':
                        res=xie(*args,**kwargs)
                        login['name']=name
                        login['pwd']=True
                        return
res
                    else:
                        print("错误")
                elif auth_type == "sql":
                    print("很香")
            return rr
    return bb

@timmer
@bb2(auth_type="file")
def aa():
    '我的水果'
   
print("苹果")
    print(aa.__doc__)

@bb2(auth_type="file")
def cc():
    '我的小房子'
   
print("香蕉")
    print(cc.__doc__)


aa()
cc()
print(cc.__doc__)

# 先aaa,再bbb,再ccc
# @ccc
# @bbb
# @aaa
# def func():
#     pass

原文地址:https://www.cnblogs.com/jensenxie/p/8732413.html