diff options
Diffstat (limited to 'pym/_emerge/SlotObject.py')
-rw-r--r-- | pym/_emerge/SlotObject.py | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/pym/_emerge/SlotObject.py b/pym/_emerge/SlotObject.py new file mode 100644 index 000000000..492382694 --- /dev/null +++ b/pym/_emerge/SlotObject.py @@ -0,0 +1,39 @@ +class SlotObject(object): + __slots__ = ("__weakref__",) + + def __init__(self, **kwargs): + classes = [self.__class__] + while classes: + c = classes.pop() + if c is SlotObject: + continue + classes.extend(c.__bases__) + slots = getattr(c, "__slots__", None) + if not slots: + continue + for myattr in slots: + myvalue = kwargs.get(myattr, None) + setattr(self, myattr, myvalue) + + def copy(self): + """ + Create a new instance and copy all attributes + defined from __slots__ (including those from + inherited classes). + """ + obj = self.__class__() + + classes = [self.__class__] + while classes: + c = classes.pop() + if c is SlotObject: + continue + classes.extend(c.__bases__) + slots = getattr(c, "__slots__", None) + if not slots: + continue + for myattr in slots: + setattr(obj, myattr, getattr(self, myattr)) + + return obj + |