Null Object Design Pattern (Python recipe)

Null Object 我的感受很是有用。也是在review公司其余同事写代码的时候看到。python

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

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

可是什么也没有发生,既没有报错,也没有发生什么,并且对其判断仍是False,因而查看其实现才发现了这个。如下所有转自http://code.activestate.com/recipes/68205/ide

 

#!/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对象实例就能够了。ui

 

Reference:this

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

相关文章
相关标签/搜索