def __new__(cls, name, bases, classdict):
self = super().__new__(cls, name, bases, dict(classdict))
attrs_lists = [getattr(b, '__attrs__', ()) for b in bases]
attrs_lists += [[a for a in classdict if not a.startswith('__')]]
# use ordered dict like an ordered set
self.__attrs__ = tuple(OrderedDict.fromkeys(chain.from_iterable(attrs_lists)))
base_fields = {}
for base in bases:
for attr in getattr(base, '__fields__', ()):
if attr not in base_fields:
base_fields[attr] = getattr(base, attr).clone(self)
fields = {}
for attr, value in list(classdict.items()):
if attr.startswith('__'):
continue
if isinstance(value, Field):
fields[attr] = value._setup(self, attr, base=base_fields.get(attr, NOTSET))
elif attr in base_fields:
fields[attr] = base_fields[attr].clone(self, default=value)
for attr, base_field in base_fields.items():
if attr not in fields:
fields[attr] = base_field.clone(self)
for attr, field in fields.items():
for prop_name in ('fget', 'fset', 'fdel'):
prop_value = getattr(field, prop_name)
if isinstance(prop_value, FunctionType):
prop_value = prop_value.__name__
if isinstance(prop_value, str):
prop_value = getattr(self, prop_value)
setattr(field, prop_name, prop_value)
setattr(self, attr, field)
self.__fields__ = tuple(a for a in self.__attrs__ if a in fields)
return self
评论列表
文章目录