函数进阶(装饰器)

装饰器

python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。从上面这段描述中我们需要记住装饰器的几点属性,以便后面能更好的理解:

  • 实质: 是一个函数
  • 参数:是你要装饰的函数名(并非函数调用
  • 返回:是装饰完的函数名(也非函数调用
  • 作用:为已经存在的对象添加额外的功能
  • 特点:不需要对对象做任何的代码上的变动

python装饰器有很多经典的应用场景,比如:插入日志、性能测试、事务处理、权限校验等。装饰器是解决这类问题的绝佳设计。并且从引入中的列子中我们也可以归纳出:装饰器最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时因为源码去除了大量泛化的内容而使得源码具有更加清晰的逻辑

# 这是最原始的装饰器
import time        #时间模块
def timmer(func):
    def inner():
        start_time = time.time()
        time.sleep(0.1)
        func()
        end_time = time.time()
        print("==========%s==========="%(end_time-start_time))
    return inner

def func():
    print("你们好")
f = timmer(func)
f()
#运行结果:

你们好
==========0.1000056266784668===========

import time

def decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        func()
        end_time = time.time()
        print(end_time - start_time)

    return wrapper

@decorator
def func():
    time.sleep(0.8)
func() # 函数调用

#运行结果:

0.8000459671020508

 

完整的装饰器(万能装饰器)
概念
开放封闭原则
开放:他对扩展是开放的
封闭:他对修改是封闭的
装饰器使用的就是开放 封闭原则

#装饰器的固定结构

def wrapper(func):
    def inner(*args,**kwargs):
        ''' 被装饰函数执行之前添加的代码'''
        ret = func(*args,**kwargs)
        ''' 被装饰函数执行之后添加的代码'''
        return ret
    return inner


@wrapper
def fun1(a,b):
    print(a+b)
fun1(1,2)

  

装饰器小例子

# def login():
#     username = input('用户名:')
#     password = input('密码:')
#     if username == 'alex' and password == 'somebody':
#         print('登录成功')


# def art():
#     print('欢迎来到文章页')
#
# def dar():
#     print('欢迎来到日记页')
#用装饰器来实现,访问art或者dar函数,登录一次后无需再登录  

 

函数:

flag = False

def login(func):
    def inner(*args,**kwargs):
        global flag
        if flag == False:
            username = input('用户名:')
            password = input('密码:')
            if username == 'alex' and password == 'somebody':
                print('登录成功')
                flag = True
        if flag == True:
            ret = func(*args,**kwargs)
            return ret
    return inner
@login
def art():
    print('欢迎来到文章页')


@login
def dar():
    print('欢迎来到日记页')

art()
dar()

  

 类装饰器以及装饰器链   https://www.cnblogs.com/lianyingteng/p/7743876.html

 

 

  

 

转载于:https://www.cnblogs.com/mainstream/p/11030949.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值