Python学习 24 - 装饰器 、带参数的装饰器、部分解压序列

个人学习总结笔记如有不足和错误欢迎指教谢谢

        当需要修改一个已经写好的函数的时候  或者 需要给函数添加一些相同的功能的时候 就需要用到装饰器

装饰器就像 让函数调用函数 从而实现 修改已有函数 或 为函数添加功能

装饰器的定义

        本质就是一种函数,为其他函数添加附加的功能

        原则:不修改被修饰函数的源代码

                   不修改被修饰函数的调用方式

装饰器的知识储备

        装饰器 = 高阶函数 + 函数嵌套 + 闭包

        高阶函数:

                函数接收的参数是一个函数名

                函数的返回值是一个函数名

                满足以上条件任意一个都可以称之为高阶函数

        闭包

                就是作用域的概念

def abc(x1):  # 这就是装饰器
	def abc1(*args):
		print(123)
		res = x1(*args)  # 运行背传入的函数
		return res
	return abc1

@abc  # 它就相当于 aaa = abc(aaa)  abc 就是装饰器名字
def aaa(n1):
	print(n1)
	return '这里是aaa'

print(aaa(5555))

输出数据为:

123
5555
这里是aaa

上面的例子就是给函数aaa 装一个装饰器

用来给aaa这个函数增加一个显示123这个功能

但是又没有对aaa这个函数本身进行修改

        装饰器 其实就是 用一个嵌套的 函数 把现有的 一个独立函数 包裹起来  这样一来 就可以在嵌套的中间层 添加需要的程序 而且还不用改变现有的函数 以及 现有函数调用的方式

        还有一种 就是又参数的 装饰器 就像下面的例子 装饰也是可以带入相应的参数 来影响 中间层的 函数执行命令 导致输出的结果不同

def abcd(shuchuzifu):
    def abc(x1):
        def abc1(*args):
            if shuchuzifu == 1:
                print(123)
            elif shuchuzifu == 2:
                print(456)
            else:
                print(777777)
            res = x1(*args)  # 运行背传入的函数
            return res
        return abc1
    return abc

@abcd(2)  # 它就相当于 aaa = abcd(aaa)  abcd 就是装饰器名字 (2)就是给整个装饰器中间层带的参数
def aaa(n1):
	print(n1)
	return '这里是aaa'

print(aaa(5555))

输出结果为

456
5555
这里是aaa

可以看出 其实我们只是在原来的 装饰器外面 又套了一层函数 而且让这个函数 return 原来的函数名

然后再把原来@的 装饰器名 改变成 装饰器最外层的函数名 这样就能把这个参数带入了 装饰器中

带参数的装饰器

        可以在无参数的装饰器外层再 套一层 函数 这个函数 只是在最初定义的时候 定义所需要的参数个数 的变量名 类型等

        然后 这个最外层的 函数 return 就是里面下一层的函数 也就是 无参数的函数

        再@的时候 要@外层的函数 并且附带上真实的参数

ps:解压序列

a,b,c = (1, 2, 3)
#上面这个赋值就等于下面
a = 1
b = 2
c = 3

这样比较便利

还有一种用法就是

a,b,c,d,e = (1, 2, 3, 4, 5)
a, *_, e = (1, 2, 3, 4, 5)
#a = 1
#_ = (2, 3, 4)
#e = 5

中间的_承受了 中间所有的 赋值

另外再 python中

a = 1
b = 2
a, b = b, a
# a = 2 ,b = 1

还可以这样使用解压序列

非常的方便

                           

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值