class FamilyNameWithUnitsLinkage(HasTraits): """ units and family_name are always compatible. family_name is the master and must be changed first if you want to change both. """ family_name = FamilyNameTrait( 'length', is_strict=True, allow_none=False, units_trait='units') units = UnitsTrait( 'm', is_strict=True, allow_none=False, family_trait='family_name') def __init__(self, **traits): """ Create a new FamilyNameWithUnitsLinkage. """ # HasTraits.__init__ will assign attributes from **traits in an abitrary # order (its a dictionary). However, this class defines a relationship # between units and family_name and therefore must make sure the # assignments are done in the proper order. if 'units' in traits and 'family_name' in traits: units = traits.pop('units') family_name = traits.pop('family_name') else: units = family_name = None super(FamilyNameWithUnitsLinkage, self).__init__(**traits) if units is not None: self.family_name = family_name self.units = units return
class FamilyNameStrict(HasTraits): family_name = FamilyNameTrait(is_strict=True)
class FamilyNameStrictNotNone(HasTraits): family_name = FamilyNameTrait('unknown', is_strict=True, allow_none=False)
class UnitsStrictWithFamily(HasTraits): units = UnitsTrait( is_strict=True, allow_none=True, family_trait='family_name') family_name = FamilyNameTrait('unknown', allow_none=False)