class Record: def __init__(self, *args): # use varargs list for field, default in self.fields: # for all common fields if args: # defined in subclass setattr(self, field, args[0]) args = args[1:] # assign next argument else: setattr(self, field, default) # or take default value def basic(self): result = [] for field, default in self.fields: # collect common fields result.append((field, getattr(self, field))) return result def extra(self): result = [] for attr in self.__dict__.keys(): # collect unique fields for field, default in self.fields: # or map/lambda here if field == attr: break else: result.append(attr, getattr(self, attr)) return result def info(self): return (self.basic(), self.extra()) # collect all fields class Person(Record): fields = [('name', ''), ('job', ''), ('pay', 0)] # static: common fields class Student(Record): fields = [('name', ''), ('id', 0), ('year', 0), ('age', 20)]