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

Dave Angel d at davea.name
Thu Aug 30 11:18:26 EDT 2012


On 08/30/2012 10:48 AM, Marco Nawijn wrote:
> On Thursday, August 30, 2012 4:30:59 PM UTC+2, Dave Angel wrote:
>> On 08/30/2012 10:11 AM, Marco Nawijn wrote:
>>
>>> On Thursday, August 30, 2012 3:25:52 PM UTC+2, Hans Mulder wrote:
>>
>>>> <snip>
>>
>>>>
>>
>>> Learned my lesson today. Don't assume you know something. Test it first ;). I have done quite some programming in Python, but did not know that class attributes are still local to the instances. 
>>
>>
>>
>> They're not.  They're just visible to the instances, except where the
>>
>> instance has an instance attribute of the same name.  Don't be confused
>>
>> by dir(), which shows both instance and class attributes.
>>
>>
>>
>> Please show me an example where you think you observe each instance
>>
>> getting a copy of the class attribute.  There's probably some other
>>
>> explanation.
> 
> I don't have an example. It was just what I thought would happen. Consider the following. In a class declaration like this:
> 
> class A(object):
>     attr_1 = 10
> 
>     def __init__(self):
>        self.attr_2 = 20
> 
> If I instantiated it twice:
> 
> obj_1 = A()
> obj_2 = A()
> 
> For both obj_1 and obj_2 attr_1 equals 10. What I thought would happen after the following statement:
> 
> obj_1.attr_1 = 12
> 
> is that obj_2.attr_1 also equals 12. This is what surprised me a little, that's all. 
> 
> Marco
> 

That statement only adds an instance attribute, not modifying the class
attribute of the same name.  But it does "hide" it from that particular
instance.

The thing that can be surprising is that if the class attribute is
mutable, and you mutate it, rather than assigning it.  So for example:

class A(object):
     attr_1 = [10, 9]

     def __init__(self):
        self.attr_2 = 20


 obj_1 = A()
 obj_2 = A()

obj_1.attr_1.append(3)

Then I believe you'll see [10, 9, 3] from both instances.
print obj_1.attr_1
print obj_2.attr_1



-- 

DaveA



More information about the Python-list mailing list