zoukankan      html  css  js  c++  java
  • 设计模式之回调机制

    # 回调模式:把函数作为参数,传递给另一个函数,延迟到另一个函数的某个时刻执行的过程叫回调。
    # 缺点:回调地狱
    # 面向过程的实现方式
    def callback(*args, **kwargs):
        """回调函数"""
        # TODO 函数体的实现
        pass
    
    
    def otherFunc(func. *args, **kwargs):
        """高阶函数,也叫包含函数"""
        # TODO 函数体的实现
        pass
    
    
    # 面向对象的实现方式:策略模式
    from abc import ABCMeta, abstractmethod
    
    
    class Strategy(metaclass=ABCMeta):
        """算法的抽象类"""
        @abstractmethod
        def algorithm(self, *args, **kwargs):
            """定义算法"""
            pass
    
    
    class StrategyA(Strategy):
        """策略A"""
        def algorithm(self, *args, **kwargs):
            print("算法A的实现")
    
    
    class StrategyB(Strategy):
        """策略A"""
        def algorithm(self, *args, **kwargs):
            print("算法A的实现")
    
    
    class Context:
        """上下文环境类"""
        def interface(self, strategy, *args, **kwargs):
            """交互接口"""
            print("回调执行前的操作")
            strategy.algorithm()
            print("回调执行后的操作")
    
    # 调用方式
    # context = Context()
    # context.interface(StrategyA())
    # context.interface(StrategyB())
    
    # 回调在异步中的应用
    # 异步的两种实现方式:多线程、多任务与事件循环
    
    import requests
    from threading import Thread
    
    class DownloadThread(Thread):
        # 每次写文件的缓冲大小
        CHUNK_SIZE = 1024 * 512
    
        def __init__(self, fileName, url, savePath, callBackProgress, callBackFinished):
            super().__init__()
            self.__fileName = fileName
            self.__url = url
            self.__savePath = savePath
            self.__callBackProgress = callBackProgress
            self.__callBackFinished = callBackFinished
    
        def run(self):
            readSize = 0
            r = requests.get(url=self.__url, stream=True)
            totalSize = int(r.headers.get("Content-Length"))
            print("[下载%s] 文件大小:%d" % (self.__fileName, totalSize))
            with open(self.__savePath, "wb") as file:
                for chunk in r.iter_content(chunk_size=self.CHUNK_SIZE):
                    if chunk:
                        file.write(chunk)
                        readSize += self.CHUNK_SIZE
                        self.__callBackProgress(self.__fileName, readSize, totalSize)
            self.__callBackFinished(self.__fileName)
    
    
    def testDownload():
        def downloadProgress(fileName, readSize, totalSize):
            """"定义下载进度的回调函数"""
            percent = (readSize / totalSize) * 100
            print("[下载5s] 下载进度:%.2f%%" % (fileName, percent))
    
        def downloadFinished(filename):
            """定义下载完成后的回调函数"""
            print("[下载%s] 文件下载完成!" % fileName)
    
        
        print("开始下载TestForDownload1.pdf......")
        downloadUrl1 = ""
        download1 = DownloadThread("TestForDownload1", downloadUrl1, "./download.TestForDownload1.pdf", downloadProgress, downloadFinished)
        download1.start()
        print("开始下载TestForDownload2.pdf......")
        downloadUrl2 = ""
        download2 = DownloadThread("TestForDownload2", downloadUrl2, "./download.TestForDownload2.pdf", downloadProgress, downloadFinished)
        download2.start()
    
        # 执行其他任务
  • 相关阅读:
    [转]顶点数据压缩
    [转]将某个Qt4项目升级到Qt5遇到的问题
    「05」回归的诱惑:一文读懂线性回归
    AI漫谈:我们距离实现《庆余年》里的五竹叔机器人还有多远?
    “木兰”去哪儿了?被全国700所中小学引入的国产编程语言“木兰”,为何在官网删除了下载链接
    有哪些让人相见恨晚的Python库(一)
    2019年最值得关注的AI领域技术突破及未来展望
    为什么样本方差的分母是n-1?为什么它又叫做无偏估计?
    「04」机器学习、深度学习需要哪些数学知识?
    「03」机器学习、深度学习该怎样入门?
  • 原文地址:https://www.cnblogs.com/loveprogramme/p/13174352.html
Copyright © 2011-2022 走看看