DRY and static attribute for multiple classes.

Peter Otten __peter__ at web.de
Wed Feb 2 12:18:44 CET 2011


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




More information about the Python-list mailing list