python 之 函数 装饰器

本文深入讲解了Python装饰器的概念,包括其工作原理、无参装饰器、有参装饰器的使用及模板,通过实例展示了如何利用装饰器在不修改源代码的情况下为函数添加新功能。

5.8 装饰器

1 开放封闭原则 软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的 也就是说我们必须找到一种解决方案: 能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能 原则如下: 1、不修改源代码 2、不修改调用方式 目的: 在遵循1和2原则的基础上扩展新功能

装饰器: 装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能,装饰器与被装饰的对象均可以是任意可调用的对象

装饰器 ===》函数 被装饰的对象 ===》函数

5.81 无参装饰器举例
import time
def index():
    time.sleep(3)
    print('welcome to index page')
def outter(func): #func=最原始的index
    def wrapper():
        start_time=time.time()
        func()
        stop_time=time.time()
        print(stop_time-start_time)
    return wrapper
​
index=outter(index)     # 新的index=wrapper
index()                #wrapper()
welcome to index page
3.0000429153442383
5.82 无参装饰器升级
import time
def index():
    time.sleep(1)
    print('welcome to index page')
    return 122
def home(name):
    time.sleep(2)
    print('welcome %s to home page' %name)
#==============装饰器
def timmer(func):               #func=最原始的index
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs) #调用最原始的index
        stop_time=time.time()
        print(stop_time-start_time)
        return res
    return wrapper
​
index=timmer(index) # 新的index=wrapper
home=timmer(home) #新的home=wrapper
# ==========================================
​
res=index()             #res=wrapper()
print(res)
res=home(name='egon')   #res=wrapper(name='egon')
print(res)
5.83 无参装饰器模板:
def index():
    pass
#==============装饰器
def outer(func):
    def inner(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    return inner
​
index=outer(index)  
# ==========================================
res=index()             
print(res)

使用:在被装饰对象正上方单独一行,@无参装饰器名

@无参装饰器名
def foo():
    pass
5.84 装饰器语法糖
import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print(stop_time-start_time)
        return res
    return wrapper
​
@timmer              #index=timmer(index)
def index():
    time.sleep(1)
    print('welcome to index page')
    return 122
​
@timmer             # home=timmer(home)
def home(name):
    time.sleep(2)
    print('welcome %s to home page' %name)
​
index()
home('egon')
5.85 叠加装饰器
import time
current_user={
    'username':None,
}
​
def auth(func):      # func=index
    def wrapper(*args,**kwargs):
        if current_user['username']:
            print('已经登陆过了')
            res=func(*args,**kwargs)
            return res
        uname=input('用户名>>: ').strip()
        pwd=input('密码>>: ').strip()
        if uname == 'egon' and pwd == '123':
            print('登陆成功')
            current_user['username']=uname
            res=func(*args,**kwargs)
            return res
        else:
            print('用户名或密码错误')
    return wrapper
​
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print(stop_time-start_time)
        return res
    return wrapper
​
@timmer # timmer 统计的是auth+index的执行时间
@auth
def index():
    time.sleep(1)
    print('welcome to index page')
    return 122
​
index()
5.86 有参装饰器
import time
current_user={
    'username':None
}
def auth(engine):        # engine='file'    #添加一层函数传engine值
    def auth2(func):     # func=index
        def wrapper(*args,**kwargs):
            if engine == 'file':
                if current_user['username']:
                    print('已经登陆过了')
                    res=func(*args,**kwargs)
                    return res
                uname=input('用户名>>: ').strip()
                pwd=input('密码>>: ').strip()
                if uname == 'egon' and pwd == '123':
                    print('登陆成功')
                    current_user['username']=uname
                    res=func(*args,**kwargs)
                    return res
                else:
                    print('用户名或密码错误')
            elif engine == 'mysql':
                print('基于MyQL的认证')
            elif engine == 'ldap':
                print('基于LDAP的认证')
        return wrapper
    return auth2
#auth_src=auth('ldap')
#@auth_src
​
@auth('ldap')       # @auth2 #index=auth2(index) #index=wrapper
def index():
    time.sleep(1)
    print('welcome to index page')
    return 122
​
index()             # wrapper()
5.87 有参装饰器模板
def outter2(x,y,z):
    def outter(func):
        def wrapper(*args,**kwargs):
            res=func(*args,**kwargs)
            return res
        return wrapper
    return outter
@outer2(1,2,3)
# ==========================================
def index():
    pass
res=index()             
print(res)
使用:在被装饰对象正上方单独一行,@有参装饰器名(1,2,3)

@有参装饰器名(1,2,3)
def foo():
    pass

转载于:https://www.cnblogs.com/mylu/p/11006349.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值