当前位置: 首页 > article >正文

Python 装饰器与偏函数

目录

装饰器

概念

简单的装饰器

复杂点的装饰器

通用装饰器

定义通用装饰器

使用装饰器

偏函数

引入类库

应用

总结


装饰器

概念

装饰器就是个闭包;把一个函数当做参数,返回一个修改过功能的函数;

本质上是一个返回函数的函数。

简单的装饰器

定义一个fun1函数,然后定义一个outer函数在不对fun1函数修改的前提下,

fun1返回进行修饰。

示例如下:

def fun1():
    print('this is fun1')

def outer():
    print('对方法进行装饰')
    fun1()

outer()

# 执行结果
# 对方法进行装饰
# 这是 fun1 方法

不过一般会传递函数参数,并把对方法装饰写在一个内部函数中处理,并返回装饰函数。

示例如下:

def fun1():
    print('这是 fun1 方法')

def outer(fun):
    def inner():
        print('对 %s 方法进行修饰' % (str(fun)))
        fun()
    return inner

f1 = outer(fun1)
f1()

# 执行结果
# 对 <function fun1 at 0x000001DED3ED1288> 方法进行修饰
# 这是 fun1 方法

说明:

复杂点的装饰器

使用@符号将装饰器应用到函数。

写一个函数获得张三家的剩余苹果数量;

通过装饰器判断参数如果小于0,则参数值修改为0。

示例如下:

def get_apple(num):
    print('张三有%d个苹果' % num)

# 没有装饰器 结果为负数
get_apple(-1)


def outer(fun):
    def inner(num):
        if num < 0:
            num = 0
        fun(num)
    return inner

@outer
def get_apple(num):
    print('张三有%d个苹果' % num)

# 通过装饰器修改 如果数量小于0 则数量为0
get_apple(-1)

通用装饰器

上面的装饰器,只能说是定制的装饰器,只能接收特定的值。

下面通过之前学到的不定长参数定义一个通用的装饰器。

定义通用装饰器

*args接收单个值的参数;

**kwargs接收关键字方式的值参数。

示例如下:

def outer(fun):
    def inner(*args, **kwargs):
        # 添加修改的功能语句
        print('添加修改的功能语句')
        fun(*args, **kwargs)
    return inner

使用装饰器

示例如下:

@outer
def get_student(name, address):
    print('My name is %s, and I come from %s!' % (name, address))


get_student('zhang san', 'hebei')

# 执行结果
# 添加修改的功能语句
# My name is zhang san, and I come from hebei!

 

偏函数

偏函数是指固定一个函数的某些参数,并生成一个新的函数。 换句话说,偏函数是通过一个已有函数创建一个新函数,这个新函数固定住原函数的一些参数,从而减少了参数的个数。

 

引入类库

示例如下:

from functools import partial

应用

字符串转化为二进制数,通过使用偏函数将int函数的base参数固定为2。

示例如下:

str_to_bin = partial(int, base=2)
print(str_to_bin("1000"))
print(str_to_bin("1010"))

# 执行结果
# 8
# 10

总结

本篇是对python 中装饰器和偏函数的简单内容整理;偏函数比较简单一些日常开发中也用到过,只是不知道这属于偏函数;装饰器在django框架中验证请求方法和csrf时使用过。


http://www.kler.cn/news/149644.html

相关文章:

  • 又有两大巨头官宣加入鸿蒙, 鸿蒙已成, 华为余承东说得没错
  • 五、cookie、session、token、localstroage、sessionStroage区别
  • 探索低代码之路——JNPF
  • 哪里可了解低代码数据可视化开发平台?
  • 多线程,线程池,线程的创建,线程池的参数
  • 使用mock.js模拟数据
  • 【JavaEE初阶】 HTTP响应报文
  • Linux常见指令基础知识
  • C#中集合和索引器
  • temu的产品发布后在哪里显示
  • Linux:配置Ubuntu系统的镜像软件下载地址
  • java springboot中使用 AOP监听方法执行周期
  • 宏基因组分析项目又双叒叕出新了!期盼已久的铁循环来了!!
  • HTTP协议发展
  • 虚幻学习笔记3—UI跟随弹窗
  • Kafka生产者发送消息的流程
  • 电商盛行的今天,这个平台热度还在持续增高!
  • C语言:输入3个整数,按由小到大的顺序输出(指针)
  • 数字化时代的政务服务:构建便捷高效的线上政务大厅
  • Centos7使用rpm安装mysql 5.7.43
  • 【matlab程序】matlab画台风符号和实例应用
  • Web UI自动化测试框架
  • 1.5 C语言之字符输入输出
  • 初始本地仓库推送到远程仓库-git
  • 如何在自定义数据集上训练 YOLOv8 实例分割模型
  • Spring的@Feign源码分析
  • 【解决】HDFS JournalNode启动慢问题排查
  • SpringCloud之服务网关Gateway组件使用——详解
  • uniapp+微信小程序监听返回事件
  • Postman进阶功能实战演练