type
status
date
slug
summary
tags
category
icon
password

Python装饰器@

参考两位大佬的博客:FOOFISH廖雪峰的官方网站
在Python中很神奇的一点就是它的函数可以被当做变量来用,在C++中可以利用virtual关键字实现动态重载来提高函数的可用性,灵活性。在Python中,我们想给函数加功能,但又不想改变函数本身,这时候我们就可以用到装饰器(decorator)去给函数加功能,也可以利用语法糖@实现。

测试拿函数当变量用

装饰器尝试

装饰器第一次尝试

假设我们有fun_a、fun_b、fun_c等多个函数,fun_b、fun_c等函数都需要用到fun_a的功能。这时候我们可以这么做:
这样做,可以实现预期效果,但是我不想每次拿函数当参数去传递,我想给函数加功能!不是当参数!

装饰器第二次尝试

此时,我们的目的实现了,我是在调用fun_b,而不是去当参数!

利用语法糖@第三次尝试

这时候我们简单高效的实现了我们最初想要给函数临时加功能的需求了!

装饰器进阶

为了方便我们这里插入Python可变参数的用法即:*args和**kwargs,名字随便。但二者共同使用时,*args要放在**kwargs前面*args表示任何多个无名参数,它本质是一个 tupledef fun_a(*args): print(args)fun_a(1,2,3,'a','b','c')# 输出(1, 2, 3, 'a', 'b', 'c')**kwargs 表示关键字参数,它本质上是一个 dictdef fun_a(**kwargs): print(kwargs)fun_a(a='1',b='2',c='3')# 输出{'a': '1', 'b': '2', 'c': '3'}

fun_b带参数

装饰器带参数

想要实现装饰器带参数,需要在装饰器定义处加一层嵌套,达到带参数进场的效果。def fun_a(str): def decorator(fun_name):     def use_fun(*args):         if str == '土弟':             print("我是函数a!")         else:             print('暗号错误!')         return fun_name(*args)     return use_fun return decorator@fun_a('土弟')def fun_b(name,age,height): print(f'姓名{name} 年龄{age} 身高{height}')fun_b('jack',18,188)# 输出我是函数a!姓名jack 年龄18 身高188

装饰器顺序




除此之外,装饰器还有类装饰器,暂时还没看。
Python位运算tmux速成