A change to a class attribute does not propagate - bug or feature?

Brian McErlean b_mcerlean at yahoo.com
Thu Jan 10 06:19:32 EST 2002


vesselin at beonic.com (Vesselin) wrote in message news:<84b16e14.0201092325.242c10df at posting.google.com>...
> """ Please run this code. It seems that in the line:
>     def __init__(self, Name = "newClass" + str(baseClass.ClassId)):
> Python takes the value of baseClass.ClassId from somewhere else
> I use ActivePython build 2.1.212
> """

> class newClass(baseClass):
>     def __init__(self, Name = "newClass" + str(baseClass.ClassId)):

This line is the problem.  The code in the arguments is evaluated 
at the time the function is created - so this is evaluated at the 
start of your program, becoming:
     def __init__(self, Name = "newClass1"):

To fix this, put the code in the body of your function - ie.

class newClass(baseClass):
    def __init__(self, Name = None):
        if Name == None:
             Name = "newClass" + str(baseClass.ClassId)
        baseClass.__init__(self, Name)

In some cases, you may want to allow None to be passed in as a value, in which
case, use some other value to distinguish "no default passed", eg.

class _NoDefault: pass

class newClass(baseClass):
    def __init__(self, Name = _NoDefault):
        if Name == _NoDefault:
             Name = "newClass" + str(baseClass.ClassId)
        baseClass.__init__(self, Name)

Hope this helps,
Brian.



More information about the Python-list mailing list