On Feb 2, 12:18 pm, Peter Otten <__pete...@web.de> wrote: > Marc Aymerich wrote: > > On Feb 2, 12:11 am, Peter Otten <__pete...@web.de> wrote: > >> Marc Aymerich wrote: > >> > Hi all, > >> > I want to provide an encapsulated static attribute called _registry > >> > for several classes. > > >> > I try to use inheritance in order to make it DRY: all classes inherit > >> > from a BaseClass that implements the _registry encapsulation. But with > >> > inheritance it doesn't work how I want, because a single instance of > >> > the _registry is shared between all of the inherited classes, and I > >> > want to have an independent _registry for every class. > > >> > How can I do that without coping all the code in every class? > > >> If you want to go fancy use a metaclass: > > >> >>> class Base(object): > > >> ... class __metaclass__(type): > >> ... def __init__(self, *args): > >> ... type.__init__(self, *args) > >> ... self.per_class = [] > > > Many thanks Peter!! > > Here's a variant that doesn't rely on the metaclass: > > class Base(object): > registries = {} > @property > def per_class(self): > cls = type(self) > try: > return self.registries[cls] > except KeyError: > result = self.registries[cls] = [] > return result > > class A(Base): pass > class B(Base): pass > > assert A().per_class is A().per_class > assert B().per_class is B().per_class > assert A().per_class is not B().per_class
Wow, many many thanks Peter, this works perfectly for me :) -- http://mail.python.org/mailman/listinfo/python-list