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 -- http://mail.python.org/mailman/listinfo/python-list