from fields import Field, TextField, MoneyField, StateField class Model(object): def __init__(self): for (key, value) in self.__class__.__dict__.items(): if isinstance(value, Field): field = getattr(self, key) if not field.name: setattr(field, 'name', key) def __setattr__(self, key, value): if hasattr(self, key) and isinstance(getattr(self, key), Field): getattr(self, key).value = value else: self.__dict__[key] = value def get_fields(self): fields = [] for key in self.__class__.__dict__.keys(): attr = getattr(self, key) if isinstance(attr, Field): fields.append(attr) return fields def get_sorted_fields(self): fields = self.get_fields() fields.sort(key=lambda x:x.creation_counter) return fields def validate(self): for f in self.get_fields(): f.validate() def output(self): return ''.join([field.get_data() for field in self.get_sorted_fields()]) class TestModel(Model): field_a = TextField(max_length=20) field_b = MoneyField(max_length=10) state = StateField()