Fredrik Lundh wrote:
Baoqiu Cui wrote:
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?
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.
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
--
http://mail.python.org/mailman/listinfo/python-list