python-day13

今日内容:

1.装饰器

2.内置函数

1.装饰器

对现有函数不进行任何修改的进行功能扩展。

开放封闭原则:

  1.对扩展开放
  2.对修改封闭,不修改源代码
  3.不改变之前的调用方式

简单版装饰器:

import time
def func(a,b):
    print("旧功能")
    print(a if a > b else b)
    time.sleep(1)

def wrapper(f):
    def inner(*args,**kwargs):  # 接收多个参数
        print("新功能")
        start = time.time()
        f(*args,**kwargs)
        print("执行时间:%s."%(time.time()-start))
    return inner

func = wrapper(func)
func(10,20)
"""
新功能
旧功能
20
执行时间:1.000023603439331.
"""

语法糖版本:

import time
def wrapper(f):
    def inner(*args,**kwargs):
        print("新功能")
        start = time.time()
        f(*args,**kwargs)
        print("执行时间:%s."%(time.time()-start))
    return inner

@wrapper   # func = wrapper(func)
def func(a,b):
    print("旧功能")
    print(a if a > b else b)
    time.sleep(1)

func(10,20)

套了多层装饰器:

import time
def wrapper(f):
    def inner(*args,**kwargs):
        print(1)
        print("新功能")
        start = time.time()
        f(*args,**kwargs)
        print("执行时间:%s."%(time.time()-start))
    return inner

def wrapper2(f):
    def inner(*args,**kwargs):
        print(2)
        print("新功能")
        start = time.time()
        f(*args,**kwargs)
        print("执行时间:%s."%(time.time()-start))
    return inner

def wrapper3(f):
    def inner(*args,**kwargs):
        print(3)
        print("新功能")
        start = time.time()
        f(*args,**kwargs)
        print("执行时间:%s."%(time.time()-start))
    return inner


# wrapper3 包着 wrapper2 包着 wrapper 包着 原func
@wrapper3  # func = wrapper3(func)  # 新func --> wrapper3 : inner --> wrapper2 : inner --> wrapper : inner --> 原func
@wrapper2  # func = wrapper2(func)  # 新func --> wrapper2 : inner --> wrapper : inner --> 原func
@wrapper   # func = wrapper(func)   # 新func -- > wrapper : inner --> 原func
def func(a,b):
    print("旧功能")
    print(a if a > b else b)
    time.sleep(1)
# func = wrapper(func)
# func = wrapper2(func)
# func = wrapper3(func)

func(10,20)
"""
3
新功能
2
新功能
1
新功能
旧功能
20
执行时间:1.000126838684082.
执行时间:1.000126838684082.
执行时间:1.000126838684082.
"""
View Code

需要查询原函数信息需要用到:wraps()

# 装饰器----对原函数操作
import time
from functools import wraps

def wrapper(f):
    @wraps(f)   # 返回正确的函数名的内容
    def inner(*args,**kwargs):
        print("新功能")
        start = time.time()
        f(*args,**kwargs)
        print("执行时间:%s."%(time.time()-start))
    return inner

@wrapper  # 相当于  func = wrapper(func)
def func(a,b):
    """
    原func的注释。
    """
    print("旧功能")
    print(a if a > b else b)
    time.sleep(1)

print(func.__name__)
print(func.__doc__)
func(10,20)
"""
func      #不用@wraps() 返回的内容为inner

    原func的注释。
    
新功能
旧功能
20
执行时间:1.0000817775726318.
"""
View Code

动态使用装饰器:

from functools import wraps
import time

def test(flag):
    def wrapper(func):
        if flag:
            @wraps(func)
            def inner(*args,**kwargs):
                print("新功能")
                result = func(*args,**kwargs)
                return result
            return inner
        else:
            return func
    return wrapper

# False 表示不使用装饰器功能,True表示使用
@test(True)   # 相当于 func = test(False)(func)
def func():
    print("旧功能")
    time.sleep(1)
    return 1

print(func())
print(func.__name__)
View Code

猜你喜欢

转载自www.cnblogs.com/zezhou/p/10554103.html