More explicit solution:
from copy import deepcopy class Field(object): def __init__(self): self.errors = [] class BaseForm(object): def __init__(self): self.fields = deepcopy(self.fields) class MetaForm(type): def __new__(cls, name, bases, attrs): attrs['fields'] = dict([(name, attrs.pop(name)) for name, obj in attrs.items() if isinstance(obj, Field)]) return type.__new__(cls, name, bases, attrs) class Form(BaseForm): __metaclass__ = MetaForm class MyForm(Form): field1 = Field() f1 = MyForm() f1.fields['field1'].errors += ['error msg'] f2 = MyForm() print f2.fields['field1'].errors
Just moved deepcopy to BaseForm.__init__ instead, which is actually called every time an instance of MyForm is created.
source share