Python的三大神器装饰器、迭代器和生成器相关笔记

装饰器

装饰没有参数没有返回值的函数Demo

def set_fun(func):
    def call_func():
        print('装饰1---')
        func()
        print('装饰2---')
    return call_func
@set_fun
# func->test    test->call_func
def test():
    print('-----我是未被装饰的函数-----')

test()
装饰有参数没有返回值的函数
def set_fun(func):
    def call_func(count):
        print('装饰1---')
        func(count)
        print('装饰2---')
    return call_func

@set_fun # test = set_fun(test)
# func->test    test->call_func    test的函数形式 与 call_func 函数形式必须相同(参数和返回值)
def test(count):
    print('-----我是未被装饰的函数-----%s'% count)

装饰有参数有返回值的函数
def set_fun(func):
    def call_func():
        return func()
    return call_func

@set_fun # test = set_fun(test)
# func->test    test->call_func
def test():
    print('-----我是未被装饰的函数-----')
    return '我是被装饰函数的返回值'

ret = test()  # 本质上就是调用call_func
print(ret)
万能装饰器 装饰函数最完整的形式
def set_fun(func):
    def call_func(*args, **kwargs):
        return func(*args, **kwargs)

    return call_func

@set_fun # test = set_fun(test)
# func->test    test->call_func
def test(*args, **kwargs):
    print('-----我是未被装饰的函数-----')
    print(args)
    print(kwargs)


test(1)
test(1,2,3)
test(1,2, a='老王')

装饰器的实际引用

# demo
# 对于项目的核心代码(支付,订单生成等...)进行性能分析,获取代码执行所消耗的时间
import time


def set_fun(func):
    def call_func():
        star = time.time()
        func()
        end = time.time()
        delta = end - star
        print(delta)
    return call_func

@set_fun
def pay():
    time.sleep(1)
    print('正在支付中')

@set_fun
def login():
    time.sleep(2)
    print('正在登陆中')

@set_fun
def register():
    time.sleep(3)
    print('正在注册中')

pay()









# 传统不适用装饰器
# def pay():
#     star = time.time()
#     time.sleep(1)
#     print('正在支付中')
#     end = time.time()
#     delta = end - star
#     return delta
#
# def login():
#     star = time.time()
#     time.sleep(2)
#     print('正在登陆中')
#     end = time.time()
#     delta = end - star
#     return delta
#
# def register():
#     star = time.time()
#     time.sleep(3)
#     print('正在注册中')
#     end = time.time()
#     delta = end - star
#     return delta
#
# print(pay())
# print(login())
# print(register())

多个装饰器装饰一个函数

def gesture(func1):
    print('手势解锁装饰器正在装饰中')
    def call_func():
        print('正在进行手势验证')
        func1()
    return call_func

def message(func2):
    print('短信解锁装饰器正在装饰中')
    def call_func():
        print('正在进行短信验证')
        func2()
    return call_func

# 在支付前 进行两个验证,一个手势验证,一个短信验证
@gesture
@message
def pay():
    print('----我是被装饰的函数----')

pay()
规律
装饰的过程为从下到上
执行的过程为从上到下
装饰时,最后指向谁,在执行的时谁最先执行

类装饰器demo

class Person(object):
    def __init__(self,func):
        self.func = func

    def __call__(self, *args, **kwargs):
        # print("我被调了")
        self.func()

# 装饰是用来装饰函数的
@Person  # test = Person(test)
def test():
    print("我是被装饰的函数")


test()  # 调用对象, 需要实现 __call__

猜你喜欢

转载自blog.csdn.net/qq_38691608/article/details/80268664