DRY and static attribute for multiple classes.

Marc Aymerich glicerinu at gmail.com
Wed Feb 2 13:12:58 CET 2011


On Feb 2, 12:18 pm, Peter Otten <__pete... at web.de> wrote:
> Marc Aymerich wrote:
> > On Feb 2, 12:11 am, Peter Otten <__pete... at 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 :)



More information about the Python-list mailing list