Bug or Feature with (overriding) Class Variables?

Peter Otten __peter__ at web.de
Sun Nov 16 04:24:20 EST 2003


Eric Baker wrote:

> With this little snippet, i get an inconsistency between the behavior
> of string and dictionary class variables:
> 
> Python 2.2.3 (#42, May 30 2003, 18:12:08) [MSC 32 bit (Intel)] on win32
> Type "copyright", "credits" or "license" for more information.
> IDLE 0.8 -- press F1 for help
>>>> class foo:
>         dict = {}
>         string = "foostring"
>         def bar(self):

Here you are changing the value of foo.dict. The equivalent to the following
line where you are rebinding the value of self.string would be:

self.dict = {"bar-key": "bar-value}

>                 self.dict["bar-key"] = "bar-value"
>                 self.string = "bar-string"

But there's a twist: when you say fooinstance.attribute, attribute ist first
looked up in the instance, and then if not found, in the class. So
depending on the context, fooinstance.attribute may refer to a class or an
instance attribute. On the other hand, fooinstance.attribute = somevalue
will always rebind the instance attribute, to rebind the class attribute
you can do

foo.attribute = somevalue

or

fooinstance.__class__.attribute = somevalue

> Question: Which behavior is the correct one?

Both.

> Question: Is this a bug or a feature?

Feature that bugs you?


Peter




More information about the Python-list mailing list