Python反射应用场景(一)
王大力测试进阶之路
共 2952字,需浏览 6分钟
· 2022-05-03
了解了反射中四个函数的基本用法。那么反射到底有什么用呢?它的应用场景是什么呢?答案是,当不确定所需要的属性和函数是否存在时,可以使用反射。另外一个重要作用是,可以提高代码的扩展性和可维护性。假如我们把所有的加密算法都放到一个叫做encryption的模块中维护 ,并且允许使用这个模块的用户添加更多的加密算法到这个模块中。
encryption的模块内容如下:
import hashlib
import os
import sys
def md5(content=None):
"""生成字符串的SHA256值"""
if content is None:
return ''
md5_gen = hashlib.md5()
md5_gen.update(content.encode('utf-8'))
md5code = md5_gen.hexdigest()
return md5code
def sha256(content=None):
"""生成字符串的SHA256值"""
if content is None:
return ''
sha256_gen = hashlib.sha256()
sha256_gen.update(content.encode('utf-8'))
sha256code = sha256_gen.hexdigest()
return sha256code
def sha256_file(filename):
"""生成文件的SHA256值"""
if not os.path.isfile(filename):
return ""
sha256gen = hashlib.sha256()
size = os.path.getsize(filename) # 获取文件大小,单位是Byte
with open(filename, 'rb') as fd: # 以二进制方式读取文件
while size >= 1024 * 1024: # 当文件大于1MB时分块读取文件内容
sha256gen.update(fd.read(1024 * 1024))
size -= 1024 * 1024
sha256gen.update(fd.read())
sha256code = sha256gen.hexdigest()
return sha256code
def md5_file(filename):
"""生成文件的MD5值"""
if not os.path.isfile(filename):
return ""
md5gen = hashlib.md5()
size = os.path.getsize(filename) # 获取文件大小,单位是Byte
with open(filename, 'rb') as fd:
while size >= 1024 * 1024: # 当文件大于1MB时分块读取文件内容
md5gen.update(fd.read(1024 * 1024))
size -= 1024 * 1024
md5gen.update(fd.read())
md5code = md5gen.hexdigest()
return md5code
def encrypt_something(something, algorithm):
"""
通用加密算法
:param something: 待加密的内容,字符串或者文件
:param algorithm: 加密算法
:return: 加密后的内容
"""
result = ""
if algorithm == "md5":
result = md5(something)
elif algorithm == "sh256":
result = sha256(something)
elif algorithm == "sh256_file":
result = sha256_file(something)
elif algorithm == "md5_file":
result = md5_file(something)
return result
其中,encrypt_something函数提供了通用加密算法,需要调用者传入待加密的内容和加密算法,这样当调用者使用encryption.py模块时,只需导入encrypt_something函数即可。就像这样:
import encryption
print(encryption.encrypt_something("learn_python_by_coding", "sh256"))
print(encryption.encrypt_something("learn_python_by_coding", "md5"))
通过分析encrypt_something函数发现,当我们在encryption.py模块添加更多的加密算法后,就要修改encrypt_something函数,在其中增加新的if分支,随着加密算法的增加,encrypt_something函数的分支会越来越多。
学了反射之后,encrypt_something代码部分就可以这样写:
def encrypt_something(something, algorithm):
"""
通用加密算法
:param something: 待加密的内容,字符串或者文件
:param algorithm: 加密算法
:return: 加密后的内容
"""
this_module = sys.modules[__name__]
if hasattr(this_module, algorithm):
algorithm = getattr(this_module, algorithm)
result = algorithm(something)
else:
raise ValueError("Not support {} algorithm".format(algorithm))
return result
相比前面的采用if分支语句方式,反射更加简洁明了,可维护性更强,要想增加新的加密方法,只需要在encryption.py模块添加更多的加密算法即可,encrypt_something代码不需要任何变更。
评论
金融研究 | 使用Python测量关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
一女子与一男子在阳台上打扑克,被邻居偷拍后...
近日网络上又发生了一起疑似黄色谣言的事件:一女子与一男子在阳台上打扑克,被邻居偷拍后上传到网上,引发广泛舆论讨论。根据网传视频显示,一名穿着吊带睡衣的女子与一名光着上身的男性在阳台上交谈,随后开始打起扑克牌。这一幕被邻居拍下并上传至网络后,引发了许多网友的关注和猜测,其中大部分涉及到了不当的假设。当
逆锋起笔
0
金融研究(更新) | 使用Python构建关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
谷歌员工爆料 Python 基础团队原地解散
转自 | 机器之心编辑 | 蛋酱什么?谷歌解雇了整个 Python 基础团队?「当与你直接共事的每个人,包括你的主管,都被裁员 —— 哦,是职位被削减,而你被要求安排他们的替代者入职,这些人被告知在不同的国家担任同样的职位,但他们并不为此感到高兴,这是很艰难的一天。」发布这一动态的 Tho
机器学习算法与Python实战
0
五一抢票难,Github上这几个Python项目,你可以试试
又到五一长假啦(虽然其实就放了1天),大家是打算家里蹲or出去玩,又或者是在公司加班呢...今天给大家介绍三个和12306相关的项目,看看你是否用得上。/01/ py12306py12306购票助手,顾名思义,12306买票的~需要在python 3.6以上版本运行程序。1. 安装依赖gi
Crossin的编程教室
0
谷歌员工爆料Python基础团队原地解散
机器之心报道编辑:蛋酱什么?谷歌解雇了整个 Python 基础团队?「当与你直接共事的每个人,包括你的主管,都被裁员 —— 哦,是职位被削减,而你被要求安排他们的替代者入职,这些人被告知在不同的国家担任同样的职位,但他们并不为此感到高兴,这是很艰难的一天。」发布这一动态的 Thomas Wouter
机器学习初学者
0
Python加速运行技巧
Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,有很多时候,Python 的效率并没有想象中的那么夸张。本文对一些 Python 代码加速运行的技巧进行整理。 0. 代码优化原则 本文会介绍不少的 Python 代码加速运行的技巧。在深入代码优化细
机器学习算法与Python实战
0
学一学 Spring Boot 3.x
在 Java 后端开发领域,功能强大的 Spring 开源框架不仅是首选,也是事实上的标准。但由于 Spring 存在配置烦琐、部署不易、依赖管理困难等问题,因此基于 Spring 的快速开发框架 Spring Boot 应运而生,它能大大简化 Spring 应用程序的配置和部署过程。2018 年,
小哈学Java
0