装饰器(2)

1 什么是装饰器
器=》工具=》函数
装饰=》指的是为被装饰者添加新功能



2、为何要用装饰器
开放封闭原则:
封闭指的是对修改源代码是封闭的
开放指的是对拓展新功能是开放的

装饰器就是一个函数,该函数就是在不修改被装饰对象源代码以及调用的方式的前提下,为被装饰对象添加额外的功能

3、如何实现装饰器=》闭包函数
装饰器的目标:为被装饰对象添加额外的新功能
装饰器的实现应该遵循的原则:
1、不该被装饰对象的源代码
2、不该被装饰对象的调用方式
4.示例
# 例1:
import time

def index():
    start=time.time()
    print("index===>")
    time.sleep(0.5)
    stop=time.time()
    print("run time is : %s" %(stop - start))

index()

# 例2:
import time

def index():
    print("index===>")
    time.sleep(0.5)


start=time.time()
index()
stop=time.time()
print("run time is : %s" %(stop - start))


# 例3:
import time

def index():
    print("index===>")
    time.sleep(0.5)


def wrapper():
    start=time.time()
    index()
    stop=time.time()
    print("run time is : %s" %(stop - start))

wrapper()

# 例4:直接通过参数为函数体传参
import time

def index():
    print("index===>")
    time.sleep(0.5)


def wrapper(func):
    start=time.time()
    func()
    stop=time.time()
    print("run time is : %s" %(stop - start))

wrapper(index)


# 例5:直接通过参数为函数体传参
import time

def index():
    print("index===>")
    time.sleep(0.5)


def outter(func):
    # func=index的内存地址
    def wrapper():
        start=time.time()
        func()
        stop=time.time()
        print("run time is : %s" %(stop - start))
    return wrapper  # 千万不要加括号

index=outter(index)

index() # wrapper()



# 例6:
import time

def index(x,y,z):
    print("index===>",x,y,z)
    time.sleep(0.5)
    return 123

def home(name):
    print('welcome %s to home page' %name)
    time.sleep(1)

# index(1,2,3)
# home("egon")

def outter(func):
    # func=index的内存地址
    def wrapper(*args,**kwargs):
        start=time.time()
        res=func(*args,**kwargs)
        stop=time.time()
        print("run time is : %s" %(stop - start))
        return res
    return wrapper  # 千万不要加括号

index=outter(index)
res=index(1,2,3) # wrapper(1,2,3)
print(res)

home=outter(home)
res=home("egon")
print(res)


# 例7:语法糖
import time
from functools import wraps

def timmer(func):
    @wraps(func)
    def wrapper(*args,**kwargs):
        start=time.time()
        res=func(*args,**kwargs)
        stop=time.time()
        print("run time is : %s" %(stop - start))
        return res
    # wrapper.__name__=func.__name__
    # wrapper.__doc__=func.__doc__
    return wrapper  # 千万不要加括号

@timmer  # index=timmer(index)
def index(x,y,z):
    """
    index的文档注释
    """
    print("index===>",x,y,z)
    time.sleep(0.5)
    return 123

@timmer  # home=timmer(home)
def home(name):
    """
    home的文档注释
    """
    print('welcome %s to home page' %name)
    time.sleep(1)

res=index(1,2,3) # wrapper(1,2,3)
print(res)

res=home("egon")
print(res)


# help(index)
print(index.__name__)

# 例8:
def auth(func):
    def wrapper(*args,**kwargs):
        name=input("username>>: ").strip()
        pwd=input("password>>: ").strip()
        if name == "egon" and pwd == "123":
            print('login successful')
            res=func(*args,**kwargs)
            return res
        else:
            print("username or password error")
    return wrapper

@auth
def index():
    print('from index')

index()
View Code

 

posted @ 2020-08-08 16:06  sean_wang  阅读(89)  评论(0编辑  收藏  举报