class object's attribute is also the instance's attribute?

Hans Mulder hansmu at xs4all.nl
Thu Aug 30 09:25:22 EDT 2012


On 30/08/12 14:34:51, Marco Nawijn wrote:

> Note that if you change 'd' it will change for all instances!

That depends on how you change it.

>>>> bobj = A()
>>>> bobj.d
> 'my attribute'
> 
>>>> A.d = 'oops...attribute changed'

Here you change the attribute on the class.
That will affect all instances:

>>>> aobj.d
> 'oops...attribute changed'
> 
>>>> bobj.d
> 'oops...attribute changed'

You can also set the attribute on an instance:

>>> bobj.d = 'For bobj only'
>>> bobj.d
'For bobj only'
>>>> aobj.d
> 'oops...attribute changed'

So, if you specifically change it on one instance, thenit won't
change on other instances of the same class.

> If you want attributes to be local to the instance, you have
> to define them in the __init__ section of the class like this:

That's a good idea, but it's not required.  You can set them
later, as shown above.


> class A(object):
> 
>    def __init__(self):
>         d = 'my attribute'

That will just set the global variable d.
You want to set the instance attribute:

        self.d = 'my attribute'

>>>> aobj = A()
>>>> bobj = A()
> 
>>>> aobj.d
> 'my attribute'

Note that aobj.d will not find the global variable d,
if neither the instance, nor the class nor any of the
base classes have that attribute.

I don't know where this 'my attribute' comes from, but
it's not the instance attribute you tried to set in the
__init__ method.  Maybe your class A still has a class
attribute with that value from an earlier experiment.


Hope this helps,

-- HansM




More information about the Python-list mailing list