'Called by Numpy after array construction.
There are three cases where this can happen:
1. Someone tries to directly construct a new array by doing::
>>> ndarray.__new__(LabelArray, ...)  # doctest: +SKIP
In this case, obj will be None.  We treat this as an error case and
fail.
2. Someone (most likely our own __new__) does::
>>> other_array.view(type=LabelArray)  # doctest: +SKIP
In this case, `self` will be the new LabelArray instance, and
``obj` will be the array on which ``view`` is being called.
The caller of ``obj.view`` is responsible for setting category
metadata on ``self`` after we exit.
3. Someone creates a new LabelArray by slicing an existing one.
In this case, ``obj`` will be the original LabelArray.  We\'re
responsible for copying over the parent array\'s category metadata.'

def __array_finalize__(self, obj):

    if (obj is None):
        raise TypeError('Direct    construction    of    LabelArrays    is    not    supported.')
    self._categories = getattr(obj, 'categories', None)
    self._reverse_categories = getattr(obj, 'reverse_categories', None)
    self._missing_value = getattr(obj, 'missing_value', None)
