def __getattr__(self, attrname):
    """Dynamically get a subproperty."""
    # Optimistically try to use the dict key.
    prop = self._modelclass._properties.get(attrname)
    # We're done if we have a hit and _code_name matches.
    if prop is None or prop._code_name != attrname:
      # Otherwise, use linear search looking for a matching _code_name.
      for prop in self._modelclass._properties.values():
        if prop._code_name == attrname:
          break
      else:
        # This is executed when we never execute the above break.
        prop = None
    if prop is None:
      raise AttributeError('Model subclass %s has no attribute %s' %
                           (self._modelclass.__name__, attrname))
    prop_copy = copy.copy(prop)
    prop_copy._name = self._name + '.' + prop_copy._name
    # Cache the outcome, so subsequent requests for the same attribute
    # name will get the copied property directly rather than going
    # through the above motions all over again.
    setattr(self, attrname, prop_copy)
    return prop_copy
def __getattr__ ( self , attrname ) : prop = self . _modelclass . _properties . get ( attrname ) if prop is None or prop . _code_name != attrname : for prop in self . _modelclass . _properties . values ( ) : if prop . _code_name == attrname : break else : prop = None if prop is None : raise AttributeError ( 'Model subclass %s has no attribute %s' % ( self . _modelclass . __name__ , attrname ) ) prop_copy = copy . copy ( prop ) prop_copy . _name = self . _name + '.' + prop_copy . _name setattr ( self , attrname , prop_copy ) return prop_copy
Dynamically get a subproperty.