函数进阶(装饰器)

装饰器

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

 

  

猜你喜欢

转载自www.cnblogs.com/mainstream/p/11030949.html