Fredrik Lundh wrote:[color=blue]
> Baoqiu Cui wrote:
>[color=green]
>>The error returned is this:
>>
>>$ python bug.py
>>Exception exceptions.AttributeError: "'NoneType' object has no
>>attribute 'population'" in <bound method Person.__del__ of
>><__main__.Person instance at 0xa0c9fec>> ignored
>>
>>However, if I rename variable name 'peter' to something like 'peter1'
>>or 'david', the error is gone. Looks to me the
>>error only happens to variable name 'peter'.
>>
>>Does anyone know what is wrong? Is this a bug only on Cygwin?[/color]
>
> it is not a bug, and the documentation has the answer:
>
> language reference -> index -> __del__
>
>
http://docs.python.org/ref/customization.html#l2h-175
>
> Warning: Due to the precarious circumstances under which __del__()
> methods are invoked, exceptions that occur during their execution are
> ignored, and a warning is printed to sys.stderr instead. Also, when
> __del__() is invoked in response to a module being deleted (e.g.,
> when execution of the program is done), other globals referenced by
> the __del__() method may already have been deleted. For this reason,
> __del__() methods should do the absolute minimum needed to
> maintain external invariants.
>
> if you absolutely need to have reliable access to globals, you need to make
> sure they're available as instance variables, or are bound in some other way.[/color]
Along these lines, I think changing your code to:
class Person(object):
population = 0
def __del__(self):
self.__class__.population -= 1
peter = Person()
solves the problem. (At least it did for me.)
Steve