class constructors: class vs. instance defaults

Steve Holden steve at holdenweb.com
Wed Oct 6 19:09:12 EDT 2004


Erik Johnson <ej <at> wellkeeper wrote:

>     I am rather new to Python and still learning the finer points. I wanted
> to have a class which has a member dictionary of other class instances, a
> constructor that would initiate that dict with an empty dict if you didn't
> provide one, and a member function to stick more other classes into that
> dictionary.
> 
> I wrote something akin to this:
> 
> #! /usr/bin/python
> 
> #=======================================================================
> class Bar:
> 
>     def __init__(self, foo_d={}):
>         self.foo_d = foo_d
> 
>     def add_foo(self, foo):
>         self.foo_d[foo.key] = foo
> #=======================================================================
> 
[...]
> 
> 
>     A single, shared dictionary is definitely not what I wanted or expected
> and didn't see why it was happening.  So... I struggled with that for a
> while and eventually reasoned that the {} in the argument list to my
> constructor is executed at the time of class definition, and is essentially
> a reference to an instantiated dictionary object and therefor there is a
> little empty dictionary sitting in memory somewhere prior to me ever
> instantiating a Bar object. New Bar objects constructed without providing
> their own foo_d end up sharing that one.  I think this makes sense enough,
> now  (if I'm missing something, speak up).
> 
>     So, one work-around is to do this:
> 
> #=======================================================================
> class Bar:
> 
>     def __init__(self, foo_d=None)
>         if foo_d:
>             self.foo_d = foo_d
>         else:
>             self.foo_d = {}
> #=======================================================================
> 

[...]
> 
>     So... Yes? Is there a better way to do this sort of thing, or is that
> perfectly reasonable code?
> 
>     Thanks for taking the time to read my post! :)
> 
> -ej
> 
> 
Well you have managed to come up with the standard paradigm (and 
successfully diagnose one of the most common beginner's conundrums along 
the way) by the exercise of pure thought. I don't think there's much to 
add, except possibly "congratulations"!

regards
  Steve
-- 
http://www.holdenweb.com
http://pydish.holdenweb.com
Holden Web LLC +1 800 494 3119



More information about the Python-list mailing list