initializing mutable class attributes

Shalabh Chaturvedi shalabh at cafepy.com
Thu Sep 2 13:20:08 EDT 2004


Dan Perl wrote:

> Someone else (Shalabh) suggested descriptors for the same problem but I
> didn't get to consider such a solution until now.

This is what I had in mind:

---->8-----
class defaultvalue(object):  # this is a descriptor
    def __init__(self, name, factory):
       self.name = name
       self.factory = factory

    def __get__(self, obj, cls=None):
       if obj is None:
          return self

       val = self.factory()
       setattr(obj, self.name, val)
       return val


class C(object):
    i = defaultvalue('i',dict)
    j = defaultvalue('j',list)

c = C()
print c.i, c.j   # prints {} []
---->8-----

Once it has kicked in, it's free of the descriptor overhead. Note you 
only need to define defaultvalue once and reuse it everywhere. Also you 
can give it a function or lambda like:

    k = defaultvalue('k', lambda :[1,2,3])

I still suggest you be a good Pythoneer and use __init__() like everyone 
else. It's a useful habit of always calling the base class __init__() at 
the top of your __init__(). If you don't develop this habit (or of at 
least checking the base for __init__), you will waste debugging cycles 
when you use other libraries.

--
Shalabh










More information about the Python-list mailing list