direct initialization of class attributes vs. declarations w/in __init__

digitalorganics at gmail.com digitalorganics at gmail.com
Sun Jun 11 12:36:32 EDT 2006


Ah, you've brought me much clarity Diez, thank you. That would explain
some "bugs" I've been having...


Diez B. Roggisch wrote:
> digitalorganics at gmail.com schrieb:
> > What's the difference between initializing class variables within the
> > class definition directly versus initializing them within the class's
> > __init__ method? Is there a reason, perhaps in certain situations, to
> > choose one over the other?
>
> You are confusing class variables with instance variables. The former
> are what you can initialize inside the class-statement. However, they
> are shared amongst _all_ instances. Consider this little example:
>
> class Foo(object):
>      FOO = 1
>      BAR = []
>
>      def __init__(self, FOO):
>          self.FOO = FOO
>          self.BAR.append(FOO)
>
>      def __repr__(self):
>          return "FOO: %r\nBAR: %r\n" % (self.FOO, self.BAR)
>
>
> f1 = Foo(1)
> print f1
> f2 = Foo(2)
> print f2
> print f1
>
>
> ------
> meskal:~/Projects/CameraCalibrator deets$ python2.4 /tmp/test.py
> FOO: 1
> BAR: [1]
>
> FOO: 2
> BAR: [1, 2]
>
> FOO: 1
> BAR: [1, 2]
>
>
> -----
>
> As you can see, the list BAR is shared. And you can also see that
> _assigning_ to something like this:
>
> self.FOO
>
> will create an instance-variable. Even if a variable of the same name
> existed on the class before!
>
> Which is precisely the difference between using variable initialization
> in __init__ and inside the class-statement.
>
> BTW,
>
> self.__class__.FOO = value
>
> will set class-variables inside a method. Just if you wondered.
> 
> Diez




More information about the Python-list mailing list