zoukankan      html  css  js  c++  java
  • Fluent_Python_Part3函数即对象,06-dp-1class-func,一等函数与设计模式

    使用一等函数实现设计模式

    中文电子书P278

    合理利用作为一等对象的函数,把模式中涉及的某些类的实例替换成简单的函数,从而简化代码。

    1. 重构“策略”模式

    1. 中文电子书P282
    2. Python3.0-3.3中,声明抽象基类要使用metaclass=关键字:class Promotion(metaclass=ABCMeta)。在Python3.4中,最简单的方法是子类化abc.ABC。
    from abc import ABC, abstractmethod
    
    class Promotion(ABC):
        @abstractmethod
        def discount(self, order):
            """"""
    

    3. 具体策略用Order类实现,且有Promotion抽象基类

    1. 中文电子书P282,促销事例。

    4. 具体策略用简单的函数替换,并且去掉Promotion抽象基类

    1. 原因:每个具体策略都是一个类,但只定义了一个方法,且没有实例属性(状态)。他们看起来是普通的函数。
    2. 中文电子书P285。

    5. 寻找最优折扣额度

    1. 方法1. hardcode,写死在一个列表里,缺点是新增具体折扣策略要手动添加。
    promos = [promo1, promo2, promo3]
    
    def best_promo(order):
        """选择最佳折扣"""
        return max(promo(order) for promo in promos)
    
    1. 方法2. 用内置函数globals()找出模块中的全部策略。
    #globals()以字典形式返回的是当前的全局符号表。globals()[name]返回的是方法的地址addr, 即globals()[name]()可以调用函数。
    #过滤掉best_promo自身,防止无限递归。
    promos = [globals()[name] for name in globals() if name.endswith('_promo') and name != 'best_promo']
    
    1. 方法3. 在一个单独的模块中保存所有策略函数,把best_promo排除在外
    #用inspect模块内省promotions模块
    import inspect
    import promotions
    #inspect.getmembers()返回的是元列表,如下所示
    '''[('a_pro', <function a_pro at 0x7fec13d3d840>), ('b_pro', <function b_pro at 0x7fec13d3d8c8>), ('c_pro', <function c_pro at 0x7fec13d3d950>)]'''
    promos = [func for name, func in inspect.getmembers(promotions, inspect.isfunction)]
    

    但是这个例子是在promotions模块里都是包含能计算折扣的函数的假设上进行的。不是一个完善的方案,而是inspect(内省)的一种用途。

    1. 第7章会使用函数装饰器去实现这个电商“策略”模式示例。

    6. 命令模式通常也用单方法类实现,同样也可以换成普通的函数(或者可调用对象)。

    中文电子书P292

    7. 模式或API可以使用一等函数或可调用对象实现,减少样板代码。

    8. 设计模式与语言特性无法精确对应。

    23个经典的设计模式很好用Java实现,不意味着所有模式都能一成不变地在所有语言中使用。

  • 相关阅读:
    C#操作注册表
    redis在Windows下以后台服务一键搭建哨兵(主从复制)模式(多机)
    redis在Windows下以后台服务一键搭建哨兵(主从复制)模式(单机)
    redis在Windows下以后台服务一键搭建集群(多机器)
    redis在Windows下以后台服务一键搭建集群(单机--伪集群)
    Redis集群维护、运营的相关命令与工具介绍
    Protocol Buffer学习教程之类库应用(四)
    ArcGIS镶嵌数据集的应用-栅格显示范围控制
    QGIS加载与编辑视图图层
    ArcGIS属性域Domain探索
  • 原文地址:https://www.cnblogs.com/allen2333/p/8819615.html
Copyright © 2011-2022 走看看