<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python反射應(yīng)用場(chǎng)景(一)

          共 2952字,需瀏覽 6分鐘

           ·

          2022-05-03 10:32

          ? ? 了解了反射中四個(gè)函數(shù)的基本用法。那么反射到底有什么用呢?它的應(yīng)用場(chǎng)景是什么呢?答案是,當(dāng)不確定所需要的屬性和函數(shù)是否存在時(shí),可以使用反射。另外一個(gè)重要作用是,可以提高代碼的擴(kuò)展性和可維護(hù)性。假如我們把所有的加密算法都放到一個(gè)叫做encryption的模塊中維護(hù) ,并且允許使用這個(gè)模塊的用戶添加更多的加密算法到這個(gè)模塊中。

          encryption的模塊內(nèi)容如下:

          import hashlibimport osimport?sysdef 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: # 以二進(jìn)制方式讀取文件 while size >= 1024 * 1024: # 當(dāng)文件大于1MB時(shí)分塊讀取文件內(nèi)容 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: # 當(dāng)文件大于1MB時(shí)分塊讀取文件內(nèi)容 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: 待加密的內(nèi)容,字符串或者文件 :param algorithm: 加密算法 :return: 加密后的內(nèi)容 """ 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函數(shù)提供了通用加密算法,需要調(diào)用者傳入待加密的內(nèi)容和加密算法,這樣當(dāng)調(diào)用者使用encryption.py模塊時(shí),只需導(dǎo)入encrypt_something函數(shù)即可。就像這樣:

          import encryptionprint(encryption.encrypt_something("learn_python_by_coding", "sh256"))print(encryption.encrypt_something("learn_python_by_coding", "md5"))

          通過分析encrypt_something函數(shù)發(fā)現(xiàn),當(dāng)我們?cè)趀ncryption.py模塊添加更多的加密算法后,就要修改encrypt_something函數(shù),在其中增加新的if分支,隨著加密算法的增加,encrypt_something函數(shù)的分支會(huì)越來越多。

          學(xué)了反射之后,encrypt_something代碼部分就可以這樣寫:

          def encrypt_something(something, algorithm):    """    通用加密算法    :param something: 待加密的內(nèi)容,字符串或者文件    :param algorithm: 加密算法    :return:  加密后的內(nèi)容    """    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分支語句方式,反射更加簡(jiǎn)潔明了,可維護(hù)性更強(qiáng),要想增加新的加密方法,只需要在encryption.py模塊添加更多的加密算法即可,encrypt_something代碼不需要任何變更。

          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本成人黄色 | 激情中文字幕 | 欧美少妇一区二区 | 亚洲热免费视频 | 欧美黑人干 |