#!/usr/bin/env python # -*- coding: utf-8 -*- import copy class Prototype: def __init__(self): self._objects = {} def register_object(self, name, obj): """Register an object""" self._objects[name] = obj def unregister_object(self, name): """Unregister an object""" del self._objects[name] def clone(self, name, **attr): """Clone a registered object and update inner attributes dictionary""" obj = copy.deepcopy(self._objects.get(name)) obj.__dict__.update(attr) return obj class A: def __init__(self): self.x = 3 self.y = 8 self.z = 15 self.garbage = [38, 11, 19] def __str__(self): return '{} {} {} {}'.format(self.x, self.y, self.z, self.garbage) def main(): a = A() prototype = Prototype() prototype.register_object('objecta', a) b = prototype.clone('objecta') c = prototype.clone('objecta', x=1, y=2, garbage=[88, 1]) print([str(i) for i in (a, b, c)]) if __name__ == '__main__': main() ### OUTPUT ### # ['3 8 15 [38, 11, 19]', '3 8 15 [38, 11, 19]', '1 2 15 [88, 1]']