做网站页面一般用什么软件,QQ空间可以建设网站吗,曼联官方发文,wordpress网站实例了解了反射中四个函数的基本用法。那么反射到底有什么用呢#xff1f;它的应用场景是什么呢#xff1f;答案是#xff0c;当不确定所需要的属性和函数是否存在时#xff0c;可以使用反射。另外一个重要作用是#xff0c;可以提高代码的扩展性和可维护性。假如我们把所有的… 了解了反射中四个函数的基本用法。那么反射到底有什么用呢它的应用场景是什么呢答案是当不确定所需要的属性和函数是否存在时可以使用反射。另外一个重要作用是可以提高代码的扩展性和可维护性。假如我们把所有的加密算法都放到一个叫做encryption的模块中维护 并且允许使用这个模块的用户添加更多的加密算法到这个模块中。encryption的模块内容如下import hashlib
import os
import sys
def md5(contentNone):生成字符串的SHA256值if content is None:return md5_gen hashlib.md5()md5_gen.update(content.encode(utf-8))md5code md5_gen.hexdigest()return md5codedef sha256(contentNone):生成字符串的SHA256值if content is None:return sha256_gen hashlib.sha256()sha256_gen.update(content.encode(utf-8))sha256code sha256_gen.hexdigest()return sha256codedef sha256_file(filename):生成文件的SHA256值if not os.path.isfile(filename):return sha256gen hashlib.sha256()size os.path.getsize(filename) # 获取文件大小单位是Bytewith open(filename, rb) as fd: # 以二进制方式读取文件while size 1024 * 1024: # 当文件大于1MB时分块读取文件内容sha256gen.update(fd.read(1024 * 1024))size - 1024 * 1024sha256gen.update(fd.read())sha256code sha256gen.hexdigest()return sha256codedef md5_file(filename):生成文件的MD5值if not os.path.isfile(filename):return md5gen hashlib.md5()size os.path.getsize(filename) # 获取文件大小单位是Bytewith open(filename, rb) as fd:while size 1024 * 1024: # 当文件大于1MB时分块读取文件内容md5gen.update(fd.read(1024 * 1024))size - 1024 * 1024md5gen.update(fd.read())md5code md5gen.hexdigest()return md5codedef 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代码不需要任何变更。