Python装饰器的使用

╄→гoц情女王★ 提交于 2019-12-03 11:16:33

对于python编程人员,装饰器的使用肯定是必不可少的。

装饰器分为系统定义装饰器和自定义装饰器;系统定义装饰器:@classmethod:类方法装饰器  @staticmethod:   静态方法装饰器

装饰器的本质就是一个函数,作用是在不改变源代码的情况下,给函数增加额外的功能;装饰器的使用通过@语法糖进行调用

自定义装饰器又分为:带参的装饰器和不带参的装饰

先来说不带参的装饰器:

# 1.声明一个普通的装饰器
# 需求:获取每个函数的运行时间
import datetime,time

def get_func_time(func): # 外层作为装饰函数,必须接收参数,将被装饰函数传入
    def inner(*args):         # 内层实现被装饰函数的额外功能,如果被装饰函数需要传入参数,可以定义不定长参数:*args,或者关键字参数:**kwargs
        start_time = datetime.datetime.now()      # 获取当前时间,作为开始时间
        result = func(*args)           # 调用传入的被装饰的函数,传入需要的参数
        end_time = datetime.datetime.now()        # 获取当前时间,作为结束时间
        print('程序的运行时间为:', end_time - start_time)
        return result    # 如果被装饰函数是有返回值的,在此也应该将结果进行返回
    return inner         # 必须将内层函数对象返回,如果不返回会报:typeError

@get_func_time
def program():   #该函数不需要传入参数
    # 被装饰函数,实现休息三秒
    time.sleep(3)
# 调用函数:
program()
程序的执行结果

 

 

 

 

@get_func_time
def get_max_common_divisor(num1,num2): # 这是一个需要传入参数的函数
    '''
    求两数的最大公约数
    '''
    max_common_divisor = 0
    min_num = min(num2,num1)
    for i in range(1,min_num+1):
        if num1 % i == 0 and num2 % i ==0:
            print('这是一个公约数:',i)
            max_common_divisor = i
    return max_common_divisor
# 调用函数:get_max_common_divisor(20, 10)

 

 

 

 

 然后我们写一个带有参数的装饰器:

# 需求实现打印不同花边的姓名

# 如果需要声明一个带有参数的装饰器,则需要嵌套三层函数,最外层进行选择判断。
def decorator(choice):
    if choice == '*':
        def out(func):
            def inner(*args):
                print('**********')
                func(*args)
                print('**********')
            return inner
        return out
    elif choice  == '-':
        def out(func):
            def inner(*args):
                print('----------')
                func(*args)
                print('----------')
            return inner
        return out
    else:
        def decorator(func):
            def inner(*args):
                print('%%%%%%%%%%')
                func(*args)
                print('%%%%%%%%%%')
            return inner
        return decorator


@get_func_time          # 调用装饰器使用:@装饰器名称   # 一个函数可以调用多个装饰器
@decorator(choice='-')
def get_name(name):
    # 源代码:打印姓名
    print(name)

get_name('刘德华')

 

 

 

  

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!