Does python hate cathy?
Michael Wieher
michael.wieher at gmail.com
Sun Mar 23 21:03:32 EDT 2008
I changed the last few lines to read:
37 kalam.howMany()
38 c = Person('Catherine', 'F')
39 #cathy.sayHi()
40 #cathy.howMany()
41 #swaroop.sayHi()
42 #swaroop.howMany()
43
And I don't get the error.
However if I change line 38 to read
ca = Person('Catherine','F')
It again initializes and then the error occurs. It isn't random, I can run
the code 10, 20 times with variable name 'c' and no error, and then again
with variable name 'ca' or 'cathy' and the error does occur.
I haven't much experience with __del__() functions but you're right -- this
is strange as all hell. And I can't even imagine why it would happen at
all.
Obviously it is attempting to access the Person.population() variable.
Which is a logic error, (I think) since well, we have 3 instances of the
class being created and then the unbound variable (ie: a variable not
associated with any instantiation of the class) being incremented and
decremented.
Logically, I think it shouldn't work at all, but somehow this unbound
variable is working but in a very buggy way.
Or am I wrong? Are unbound class-variables supposed to be used to
coordinate between multiple instantiations of that class?
2008/3/23, George Sakkis <george.sakkis at gmail.com>:
>
> On Mar 23, 8:01 pm, QS <qingshan.c... at gmail.com> wrote:
> > Hi to all!
> > I am new to python, and I encountered a weird problem.
> >
> > Here is my code
> >
> > ##########>8####################
> > #!/usr/bin/python
> > # Filename: objvar.py
> > class Person:
> > '''Represents a person.'''
> >
> > population = 0
> > #sex = 'F'
> > #age = 22
> > # It is vague here: is this variable going to be a class, or
> > object, variable
> >
> > def __init__(self, name, sex):
> > '''Initializes the person's data.'''
> > self.name = name
> > self.sex = sex
> > print '(Initializing %s )' % self.name
> > # When this person is created, he/she
> > # adds to the population
> > Person.population += 1
> >
> > def __del__(self):
> > '''I am dying.'''
> >
> > print '%s says bye.' % self.name
> > Person.population -= 1
> > if Person.population == 0:
> > print 'I am the last one.'
> > else:
> > print 'There are still %d people left.' %
> > Person.population
> >
> > def sayHi(self):
> > '''Greeting by the person.
> >
> > Really, that's all it does.'''
> >
> > self.age = 25
> > print 'Hi, my name is %s, and I am %s, and I am age %d ' %
> > (self.name, self.sex, self.age)
> >
> > def howMany(self):
> > '''Prints the current population.'''
> > if Person.population == 1:
> > print 'I am the only person here.'
> > else:
> > print 'We have %d persons here.' % Person.population
> >
> > swaroop = Person('Swaroop', 'M')
> > swaroop.sayHi()
> > swaroop.howMany()
> > kalam = Person('Abdul Kalam', 'M')
> > kalam.sayHi()
> > kalam.howMany()
> > cathy = Person('Catherine', 'F')
> > cathy.sayHi()
> > cathy.howMany()
> > swaroop.sayHi()
> > swaroop.howMany()
> >
> > ############# 8< #########################
> >
> > When I run this script, I got the following exception:
> > Exception exceptions.AttributeError: "'NoneType' object has no
> > attribute 'population'" in <bound method Person.__del__ of
> > <__main__.Person instance at 0xb7d8ac6c>> ignored
> >
> > To to newcomer like me, this message doesn't make much sense. What
> > seems weird to me is that, if I change the variable cathy to something
> > else, like cath, or even cat, then the script will finish gracefully.
> > Why "cathy" is not liked?!!
> >
> > Some of you may have recognized that the code is derived from a sample
> > code in Swaroop's "A byte of python".
> >
> > My python is of version 2.5.1, on Ubuntu.
>
>
> That's really weird... it's reproducible on Windows too. It doesn't
> make any sense why the name of the variable would make a difference.
> My guess is you hit some kind of obscure bug.
>
>
> George
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20080323/b9ebdb18/attachment-0001.html>
More information about the Python-list
mailing list