'Get attribute from expando.
Must be overridden to allow dynamic properties to obscure class attributes.
Since all attributes are stored in self._dynamic_properties, the normal
__getattribute__ does not attempt to access it until __setattr__ is called.
By then, the static attribute being overwritten has already been located
and returned from the call.
This method short circuits the usual __getattribute__ call when finding a
dynamic property and returns it to the user via __getattr__.  __getattr__
is called to preserve backward compatibility with older Expando models
that may have overridden the original __getattr__.
NOTE: Access to properties defined by Python descriptors are not obscured
because setting those attributes are done through the descriptor and does
not place those attributes in self._dynamic_properties.'

def __getattribute__(self, key):

    if (not key.startswith('_')):
        dynamic_properties = self._dynamic_properties
        if ((dynamic_properties is not None) and (key in dynamic_properties)):
            return self.__getattr__(key)
    return super(Expando, self).__getattribute__(key)
