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