装饰器、有参装饰器、yield

什么是装饰器

装饰器指的定义一个函数,该函数是用来为其他函数添加额外的功能

为何要用装饰器

        开放封闭原则

             开放:指的是对拓展功能是开放的

             封闭:指的是对修改源代码是封闭的

装饰器就是在不修改被装饰器对象源代码以及调用方式的前提下为被装饰对象添加新功能

如何用

例

import time

def outter(func):
    def wrapper(*args, **kwargs): #这样可以传任何值
        start = time.time()  # start 和 stop 是增加的新功能
        res=func(*args, **kwargs) # res  和return res 是被装饰的
        stop = time.time()
        print(stop - start)
        return res

    return wrapper

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

home('123')

import time
from functools import wraps
def outter(func):
    @wraps(func)  # 将原函数的属性赋值给wrapper函数
    def wrapper(*args, **kwargs): #这样可以传任何值
        start = time.time()  # start 和 stop 是增加的新功能
        res=func(*args, **kwargs) # res  和return res 是被装饰的
        stop = time.time()
        print(stop - start)
        return res
    return wrapper


@outter
def index(x,y):
    """zhe shi zhu ye"""
    print(x,y)

print(index.__doc__)  # 查看index的一些属性
print(index.__name__) # 查看index的一些属性

有参装饰器

import time
def defouted(den):
    def outter(func):
        def wrapper(*args, **kwargs):
            if den=='abc':
                start = time.time()
                res=func(*args, **kwargs)
                stop = time.time()
                print(stop - start)
                return res
            else:
                print('错了')
        return wrapper

@defouted(den="abc")
def index(x,y):
    """zhe shi zhu ye"""
    print(x,y)

叠加多个装饰器的加载,分析

def deco1(func1):
    def wrapper1(*args,**kwargs):
        print('装饰器1进行')
        res1=func1(*args,**kwargs)
        return res1
    return wrapper1

def deco2(func2):
    def wrapper2(*args,**kwargs):
        print('装饰器2进行')
        res2=func2(*args,**kwargs)
        return res2
    return wrapper2

@deco1
@deco2
def index(x):
    print('我是主角%s'% x)

index(6666666666)

# 加载顺序自下而上(了解)
# @deco1 index=deco1(wrapper2的内存地址) ==>index=wrapper1的内存地址
# @deco2 index=deco2(index)==> index==wrapper的内存地址

# 执行顺序自上而下

yield

# s=yield 返回值
# def dog(name):
#     print('123%s'% name)
#     while True:
#         x=yield
#         print('456%s'% x)
#
# s=dog('豆豆')
#
# s.send(None) # 相当于初始化一下,没有不行,也可以 next(s)
# s.send('东东1')
# s.send('东东2')
# # s.close() # 关闭后后面的就进行不了了
# s.send('123')

# def dog(name):
#     print('123%s'% name)
#     while True:
#         x=yield 888
#         print('456%s'% x)
#
# s=dog('豆豆')
#
# s.send(None) # 相当于初始化一下,没有不行,也可以 next(s)
# res=s.send('东东1')
# print(res)
# res=s.send('东东2')
# print(res)
# res=s.send('东东3')
# print(res)
# s.send('东东2')
# s.close() # 关闭后后面的就进行不了了
# s.send('123')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值