zoukankan      html  css  js  c++  java
  • Null Object Design Pattern (Python recipe)

    Null Object 个人感觉非常有用。也是在review公司其他同事写代码的时候看到。

    当时使用了flask的request全局请求变量g,然后使用了g.x保存了一个东西。

    当时在view代码读取g.x的时候震惊了,因为这一段代码并没有保存g.x,按道理来说应该是一个空值,当我拿着空值去调用其属性的时候应该会报AttributeError。

    但是什么也没有发生,既没有报错,也没有发生什么,而且对其判断还是False,于是查看其实现才发现了这个。以下全部转自http://code.activestate.com/recipes/68205/

    #!/user/bin/env python
    # coding: utf-8
    # {{{ http://code.activestate.com/recipes/68205/ (r1)
    
    """null.py
    
    This is a sample implementation of the 'Null Object' design pattern.
    
    Roughly, the goal with Null objects is to provide an 'intelligent'
    replacement for the often used primitive data type None in Python or
    Null (or Null pointers) in other languages. These are used for many
    purposes including the important case where one member of some group
    of otherwise similar elements is special for whatever reason. Most
    often this results in conditional statements to distinguish between
    ordinary elements and the primitive Null value.
    
    Among the advantages of using Null objects are the following:
    
      - Superfluous conditional statements can be avoided
        by providing a first class object alternative for
        the primitive value None.
    
      - Code readability is improved.
    
      - Null objects can act as a placeholder for objects
        with behaviour that is not yet implemented.
    
      - Null objects can be replaced for any other class.
    
      - Null objects are very predictable at what they do.
    
    To cope with the disadvantage of creating large numbers of passive
    objects that do nothing but occupy memory space Null objects are
    often combined with the Singleton pattern.
    
    For more information use any internet search engine and look for
    combinations of these words: Null, object, design and pattern.
    
    Dinu C. Gherman,
    August 2001
    """
    
    
    class Null(object):
    
        """A class for implementing Null objects.
    
        This class ignores all parameters passed when constructing or
        calling instances and traps all attribute and method requests.
        Instances of it always (and reliably) do 'nothing'.
    
        The code might benefit from implementing some further special
        Python methods depending on the context in which its instances
        are used. Especially when comparing and coercing Null objects
        the respective methods' implementation will depend very much
        on the environment and, hence, these special methods are not
        provided here.
        """
    
        # object constructing
    
        def __init__(self, *args, **kwargs):
            "Ignore parameters."
            return None
    
        # object calling
    
        def __call__(self, *args, **kwargs):
            "Ignore method calls."
            return self
    
        def next(self):
            raise StopIteration
    
        def __len__(self):
            return 0
    
        def __eq__(self, other):
            return self is other
    
        # misc.
    
        def __repr__(self):
            "Return a string representation."
            return "<Null>"
    
        def __str__(self):
            "Convert to a string and return it."
            return ""
    
        def default(self):
            return ""
    
        def __nonzero__(self):
            return False
    
        def for_json(self):
            return ''
    
        __sub__ = __div__ = __mul__ = __floordiv__ = __mod__ = __and__ = __or__ = 
            __xor__ = __rsub__ = __rdiv__ = __rmul__ = __rfloordiv__ = __rmod__ = 
            __rand__ = __rxor__ = __ror__ = __radd__ = __pow__ = __rpow__ = 
            __rshift__ = __lshift__ = __rrshift__ = __rlshift__ = __truediv__ = 
            __rtruediv__ = __add__ = __getitem__ = __neg__ = __pos__ = __abs__ = 
            __invert__ = __setattr__ = __getattr__ = __delattr__ = __delitem__ = __setitem__ = 
            __iter__ = __call__
    
    
    Null = Null()

    这里我们在其他地方引用的时候可以直接从这个文件里引入Null,在需要的时候返回这个Null对象实例就可以了。

    Reference:

    http://code.activestate.com/recipes/68205/ ---Null Object Design Pattern (Python recipe)

  • 相关阅读:
    Cordova原理一
    View 的measure 和onMeasure
    Android Material Design 系列之 SnackBar详解
    android 透明状态栏方法及其适配键盘上推(二)
    android 透明状态栏方法及其适配键盘上推(一)
    Https握手协议以及证书认证
    App对接支付宝移动支付功能
    ViewPager 滑动一半的判断方法以及左滑右滑判断
    mvp架构解析
    解决IE8打开默认弹出开发者工具的问题
  • 原文地址:https://www.cnblogs.com/piperck/p/5662882.html
Copyright © 2011-2022 走看看