Python 动态属性:能用一个参数搞定的,就不用两个
2023-06-13 09:13:59 时间
Python 有个魔法函数 __getattr__
,可以在调用对象的某个属性时自动执行,利用这一点,我们可以实现非常灵活的功能。
举个例子,计算两个数的加减乘除,只需要传入一个参数就可以进行计算:
文件:dynamic_attr_of_class.py
的内容如下:
class DynamicAttr(object):
def __getattr__(self, name):
op, num = name.split("_")
num = int(num)
return {
"times": lambda val: val * num,
"plus": lambda val: val + num,
"minus": lambda val: val - num,
"dividedby": lambda val: val / num,
}[op]
if __name__ == "__main__":
da = DynamicAttr()
assert da.plus_10(13) == 23
assert da.times_10(13) == 130
assert da.minus_10(13) == 3
assert da.dividedby_10(13) == 1.3
上面的代码,当调用 da.plus_10
的时候,就会调用到 __getattr__
。执行 op, num = name.split("_")
后,op = 'plus', num = 10。
最后返回的是一个 lambda 函数,参数就是 val,因此 da.plus_10 相当于 lambda val: val + 10,因此 da.plus_10(13) 就是 13 + 10 = 23。
从 Python 3.7 开始,__getattr__
不仅可以为类提供动态属性,也可以为模块提供动态属性。
上面 __getattr__
函数可以直接定义在模块(一个 Python 文件)里,比如说文件 dynamic_attr_of_module.py
的内容如下:
def __getattr__(name):
op, num = name.split("_")
num = int(num)
return {
"times": lambda val: val * num,
"plus": lambda val: val + num,
"minus": lambda val: val - num,
"dividedby": lambda val: val / num,
}[op]
在另一个文件 main.py 中,就可以这样来使用:
import dynamic_attr_of_module as da
if __name__ == "__main__":
assert da.plus_10(13) == 23
assert da.times_10(13) == 130
assert da.minus_10(13) == 3
assert da.dividedby_10(13) == 1.3
是不是很方便,很灵活呢?
最后的话
本文分享了如何利用 Python 的动态属性来实现一些酷炫的函数:比如说减少函数的参数。你也可以思考一下,这个 __getattr__
还能实现哪些神奇的事情,欢迎留言分享。
相关文章
- Python 学生信息管理系统——文章中源码100%真实有效—–如何将类、初始化属性、模块、循环判断、静态方法等一系列知识点结合起来做一个项目「建议收藏」
- Python面试基础知识_python自学需要哪些基础知识
- python详细安装教程环境配置_Python配置环境
- matplotlib无法显示图片_python运行程序后不显示图像
- Python入门系列(十一)一篇搞定python操作MySQL数据库
- python 爬虫新手入门教程
- 【说站】python PyQt如何使用资源
- 【说站】python如何判断绝对路径
- Python修改文件后缀_python重命名文件名
- Python学生信息管理系统课程设计报告_python做的项目管理系统
- Python画小仓鼠
- python面向对象编程指南 pdf_python面向对象的三个基本特征
- C#/.net程序调用python
- 1行Python代码,把PPT转成图片,python-office功能更新~
- 把python脚本编译成exe
- 小试Python(二)
- Python中的各种各样的推导式
- Python 进阶指南(编程轻松进阶):二、环境配置和命令行
- Python __repr__()方法:显示属性
- Python __dict__属性:查看对象内部所有属性名和属性值组成的字典
- python通过openpyxl生成Excel文件详解编程语言
- Python MySQL 游标操作指北(pythonmysql游标)
- Python—根据字符串导入包(importlib)详解编程语言
- Python super()使用注意事项(包含新式类和旧式类的区别)
- 如何使用Python安装MySQL(python安装mysql)
- Linux与Python:开拓者的新时代(linux和python)
- 在Python中简单调用MySQL(python调用mysql)
- python通过ElementTree操作XML获取结点读取属性美化XML
- Linux下编译安装MySQL-Python教程