setting an attribute

Bruno Desthuilliers bruno.42.desthuilliers at wtf.websiteburo.oops.com
Wed May 16 04:24:38 EDT 2007


7stud a écrit :
> "When you bind (on either a class or an instance) an attribute whose
> name is not special...you affect only the __dict__ entry for the
> attribute(in the class or instance, respectively)."
> 
> In light of that statement, how would one explain the output of this
> code:
> 
> class Test(object):
>     x = [1, 2]
> 
>     def __init__(self):
>         self.x[0] = 10
> 
> print Test.__dict__    #{.....'x':[1,2]....}
> t = Test()
> print t.x              #[10, 2]
> print t.__dict__       #{}
> print Test.__dict__    #{.....'x':[10,2]...}
> 
> It looks to me like self.x[0] is binding on an instance whose
> attribute name is not special,


self.x[0] = 10 doesn't bind self.x - it's just syntactic sugar for 
self.x.__setitem__(0, 10) (which itself is syntactic sugar for 
list.__setitem__(self.x, 0, 10))

> yet it doesn't affect any __dict__
> entry for the attribute in the instance

Of course. The name 'x' is looked up in the instance, then in the class. 
Since there's no binding (only a method call on a class attribute), 
instance's dict is not affected.




More information about the Python-list mailing list