setting an attribute

7stud bbxx789_05ss at yahoo.com
Wed May 16 11:29:47 EDT 2007


On May 16, 2:24 am, Bruno Desthuilliers <bruno.
42.desthuilli... at wtf.websiteburo.oops.com> wrote:
> 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.

Thanks.




More information about the Python-list mailing list