Class-level variables - a scoping issue
Jean-Michel Pichavant
jeanmichel at sequans.com
Mon Oct 11 09:29:51 EDT 2010
John Nagle wrote:
> Here's an obscure bit of Python semantics which
> is close to being a bug:
>
> >>> class t(object) :
> ... classvar = 1
> ...
> ... def fn1(self) :
> ... print("fn1: classvar = %d" % (self.classvar,))
> ... self.classvar = 2
> ... print("fn1: classvar = %d" % (self.classvar,))
I don't think it's a bug.
None would name a class attribute and an instance attribute with the
same name. So I'm assuming that you want to assign 2 to the *class*
attribute (since it's named classvar :o) ).
You just did it wrong, self.classvar=2 creates the instance attribute
classvar. This is easly fixed by using some well choosen coding rules:
when working with class attributes within an instance either :
always write t.classvar
or
always write self.__class__.classvar
Problem solved. You could ask for python to reject self.classvar but
that would break to OO lookup algo (== an instance has acces to its
class attributes).
JM
More information about the Python-list
mailing list