装饰器基础

1.装饰器的作用

在不修改函数的情况下给函数添加新的功能

2.什么是装饰器

装饰器的本质就是一个函数(这个函数是一个实参高阶函数也是返回值高阶函数)

无参装饰器的写法:

def 函数名1(函数名2):
    def 函数名3(*args, **kwargs):
        新功能代码
        返回值 = 函数名2(*args, **kwargs)
        return 返回值
    return 函数名3

说明:
函数名1 - 装饰器名字,命名的时候和这个装饰器要添加的功能进行关联
函数名2 - 随便命名,指向被添加功能的函数; 可以命名成 fn
函数名3 - 随便命名,在原函数上添加完新的功能以后产生的新的函数
新功能代码 - 实现新加的功能的代码

写一个装饰器,在函数开始执行前打印’函数开始’

def start_function(fn):
    def new_fn(*args, **kwargs):
        print('函数开始')
        result = fn(*args, **kwargs)
        return result

    return new_fn


@start_function
def yt_sum(num1, num2):
    print(num1 + num2)


@start_function
def print_star(n):
    print('*' * n)


@start_function
def factorial(n):
    sum1 = 1
    for x in range(1, n + 1):
        sum1 *= x
    return sum1


yt_sum(10, 20)
print_star(8)

yt_sum(100, 200)

print(factorial(5))

函数开始
30

#练习1:写一个装饰器将返回值是字符串的函数,返回值中所有的小写字母变成大写字母。

def yt_upper(fn):
    # fn = str_func
    def new_fn(*args, **kwargs):
        result = fn(*args, **kwargs)
        if type(result) == str:
            return result.upper()
            # new_result = ''
            # for x in result:
            #     if 'a' <= x <= 'x':
            #         new_result += chr(ord(x)-32)
            #     else:
            #         new_result += x
            # return new_result
        else:
            return result

    return new_fn


@yt_upper
def str_func():
    return 'abc'


@yt_upper
def str_func():
    return 'abc'

相当于:

def str_func():
    return 'abc'
str_func = yt_upper(str_func)     #   str_func = new_fn


@yt_upper
def num_func():
return 100


print(str_func())

print(num_func())

#补充:定义函数的时候*args和**kwargs同时存在的意义 - 不定参数的函数在调用的时候既可以使用位置参数也可以使用关键字参数

def func1(*args, **kwargs):
    pass


func1(20, 90, 90)
func1(a=20, b=9)
func1(1, 3, 4, a=3, b=5, c=90)


def func3(x, y, z):
    print(f'x:{x}, y:{y}, z:{z}')


def func2(*args, **kwargs):
    # args = (10, 20, 30)
    # kwargs = {}
    func3(*args, **kwargs)  # func3(10, 20, 30)   func3(*(10, 20, 30))  -> func3(10, 20, 30)


func2(10, 20, 30)
func3(x=20, y=90, z=300)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值