Python论坛  - 讨论区

标题:[python-chinese] 一个莫名其妙的问题

2007年05月06日 星期日 21:29

priboy priboy.maillist在gmail.com
星期日 五月 6 21:29:42 HKT 2007

¸½¼þÖеijÌÐòͨ¹ýpython foo.pyÖ´ÐУ¬³öÏÖÒÔÏÂÌáʾÐÅÏ¢£º

Exception exceptions.AttributeError: "'NoneType' object has no
attribute 'population'" in <__main__.Person instance at 0x2aaaaab2ee60>> ignored

foo.pyÀïÃæµÄ³ÌÐòºÜ¼òµ¥£¬¾ÍÊÇÈçÏ£º

class Person:
    population = 0

    def __init__(self):
        Person.population += 1

    def __del__(self):
        Person.population -= 1

tom = Person()

Ê×ÏÈÎÒÏëÎÊһϣ¬ÉÏÃæÌáµ½µÄ´íÎóÐÅÏ¢ÊÇʲôԭÒòÔì³ÉµÄ£¿

ÁíÍ⣬ÓÐÒ»¸öÏ൱Ææ¹ÖµÄÏÖÏ󣡣¡ÎÒ°Ñ×îºóÄǾäµÄtom¸Ä³ÉÆäËûÈçjerry£¬¾ÍûÓгöÏÖÈκδíÎóÐÅÏ¢£¿£¡±äÁ¿µÄÃüÃûÓÐʲô¹æÂÉô£¿ÎÒÊÇÕÒ²»µ½À­£¬¸Ä³ÉaûÎÊÌ⣬¸Ä³ÉpÓÖ³öÏÖÎÊÌâ....ºÃÆæ¹Ö°¡£¿£¿ÄãÃÇÓÐÕâÖÖÇé¿öô£¿
-------------- 下一部分 --------------
class Person:
    population = 0

    def __init__(self):
        Person.population += 1

    def __del__(self):
        Person.population -= 1

tom = Person()

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]
yrh

yrh

2007年05月06日 星期日 22:41

yrh yuanruihong在126.com
星期日 五月 6 22:41:05 HKT 2007

priboy 写道:
> 附件中的程序通过python foo.py执行,出现以下提示信息:
>
> Exception exceptions.AttributeError: "'NoneType' object has no
> attribute 'population'" in > <__main__.Person instance at 0x2aaaaab2ee60>> ignored
>
> foo.py里面的程序很简单,就是如下:
>
> class Person:
> population = 0
>
> def __init__(self):
> Person.population += 1
>
> def __del__(self):
> Person.population -= 1
>
> tom = Person()
>
> 首先我想问一下,上面提到的错误信息是什么原因造成的?
>
> 另外,有一个相当奇怪的现象!!我把最后那句的tom改成其他如jerry,就没有
> 出现任何错误信息?!变量的命名有什么规律么?我是找不到拉,改成a没问
> 题,改成p又出现问题....好奇怪啊??你们有这种情况么?
Person.population应该写作self.population吧?


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年05月06日 星期日 22:42

Hong Yuan hongyuan在homemaster.cn
星期日 五月 6 22:42:23 HKT 2007

Python2.5下运行,没有你所说的问题,也不应该出现这样的问题。更新Python版 
本看看。

priboy wrote:
> 附件中的程序通过python foo.py执行,出现以下提示信息:
>
> Exception exceptions.AttributeError: "'NoneType' object has no
> attribute 'population'" in > <__main__.Person instance at 0x2aaaaab2ee60>> ignored
>
> foo.py里面的程序很简单,就是如下:
>
> class Person:
>    population = 0
>
>    def __init__(self):
>        Person.population += 1
>
>    def __del__(self):
>        Person.population -= 1
>
> tom = Person()
>
> 首先我想问一下,上面提到的错误信息是什么原因造成的?
>
> 另外,有一个相当奇怪的现象!!我把最后那句的tom改成其他如jerry,就没有 
> 出现任何错误信息?!变量的命名有什么规律么?我是找不到拉,改成a没问 
> 题,改成p又出现问题....好奇怪啊??你们有这种情况么?
> ------------------------------------------------------------------------
>
> class Person:
>     population = 0
>
>     def __init__(self):
>         Person.population += 1
>
>     def __del__(self):
>         Person.population -= 1
>
> tom = Person()
>   
> ------------------------------------------------------------------------
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年05月07日 星期一 04:28

shhgs shhgs.efhilt在gmail.com
星期一 五月 7 04:28:10 HKT 2007

这个问题是存在的。

我的机器是 ubuntu 7.04, Py版本 2.5。

我的感觉是 __del__。这个函数Py的Manual是不推荐你用的。大致问题出在这里。

等我查查文档再回信。

On 5/6/07, Hong Yuan <hongyuan在homemaster.cn> wrote:
> Python2.5下运行,没有你所说的问题,也不应该出现这样的问题。更新Python版
> 本看看。
>
> priboy wrote:
> > 附件中的程序通过python foo.py执行,出现以下提示信息:
> >
> > Exception exceptions.AttributeError: "'NoneType' object has no
> > attribute 'population'" in > > <__main__.Person instance at 0x2aaaaab2ee60>> ignored
> >
> > foo.py里面的程序很简单,就是如下:
> >
> > class Person:
> >    population = 0
> >
> >    def __init__(self):
> >        Person.population += 1
> >
> >    def __del__(self):
> >        Person.population -= 1
> >
> > tom = Person()
> >
> > 首先我想问一下,上面提到的错误信息是什么原因造成的?
> >
> > 另外,有一个相当奇怪的现象!!我把最后那句的tom改成其他如jerry,就没有
> > 出现任何错误信息?!变量的命名有什么规律么?我是找不到拉,改成a没问
> > 题,改成p又出现问题....好奇怪啊??你们有这种情况么?
> > ------------------------------------------------------------------------
> >
> > class Person:
> >     population = 0
> >
> >     def __init__(self):
> >         Person.population += 1
> >
> >     def __del__(self):
> >         Person.population -= 1
> >
> > tom = Person()
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese在lists.python.cn
> > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年05月07日 星期一 04:50

shhgs shhgs.efhilt在gmail.com
星期一 五月 7 04:50:31 HKT 2007

Py的 __del__调用是完全不可预料的。这就是一例。

之所以会出现这个错误,是因为Py在解释完程序作清理的时候,先把
Person类给回收了,等到它回收tom这个instance的时候才发现,Person已经变成None了,population变量自然也不知所踪了。

你可以在foo.py的最后加一句,

print vars()

你会发现,如果变量名(tom, jerry)在 Person之前,则程序不会报错,如果在Person之后,则肯定报错。

总之,Py的__del__比较怪异,用的时候要特别小心。

On 5/6/07, shhgs <shhgs.efhilt在gmail.com> wrote:
> 这个问题是存在的。
>
> 我的机器是 ubuntu 7.04, Py版本 2.5。
>
> 我的感觉是 __del__。这个函数Py的Manual是不推荐你用的。大致问题出在这里。
>
> 等我查查文档再回信。
>
> On 5/6/07, Hong Yuan <hongyuan在homemaster.cn> wrote:
> > Python2.5下运行,没有你所说的问题,也不应该出现这样的问题。更新Python版
> > 本看看。
> >
> > priboy wrote:
> > > 附件中的程序通过python foo.py执行,出现以下提示信息:
> > >
> > > Exception exceptions.AttributeError: "'NoneType' object has no
> > > attribute 'population'" in > > > <__main__.Person instance at 0x2aaaaab2ee60>> ignored
> > >
> > > foo.py里面的程序很简单,就是如下:
> > >
> > > class Person:
> > >    population = 0
> > >
> > >    def __init__(self):
> > >        Person.population += 1
> > >
> > >    def __del__(self):
> > >        Person.population -= 1
> > >
> > > tom = Person()
> > >
> > > 首先我想问一下,上面提到的错误信息是什么原因造成的?
> > >
> > > 另外,有一个相当奇怪的现象!!我把最后那句的tom改成其他如jerry,就没有
> > > 出现任何错误信息?!变量的命名有什么规律么?我是找不到拉,改成a没问
> > > 题,改成p又出现问题....好奇怪啊??你们有这种情况么?
> > > ------------------------------------------------------------------------
> > >
> > > class Person:
> > >     population = 0
> > >
> > >     def __init__(self):
> > >         Person.population += 1
> > >
> > >     def __del__(self):
> > >         Person.population -= 1
> > >
> > > tom = Person()
> > >
> > > ------------------------------------------------------------------------
> > >
> > > _______________________________________________
> > > python-chinese
> > > Post: send python-chinese在lists.python.cn
> > > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> > > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> >
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese在lists.python.cn
> > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年05月07日 星期一 11:04

bbenyu bbenyu在gmail.com
星期一 五月 7 11:04:07 HKT 2007

Çë½Ì: PIL 1.1.6 ÉÏ´«jpeg ʱ³öÏÖdecoder jpeg not available ´íÎó.
PIL/Image.py in _getdecoder, line 375

Èç¹ûÔÚ ImageField ²»¼Ó¸ßºÍ¿íµÄËõÂÔʱ¾Í²»»á.
height_field = '120', width_field = '80'

µ«ÎÒ°²×°Ó¦¸ÃÊÇûʲôÎÊÌâµÄ!

»·¾³:  FreeBSD 6.2 + Python 2.5 + PIL 1.1.6 + jpegsrc-6b.

л!
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070507/4cefdeb2/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年05月07日 星期一 16:41

priboy priboy.maillist在gmail.com
星期一 五月 7 16:41:31 HKT 2007

谢谢大家的解答,这个错误的产生确实是shhgs所说的那样...

另外,又有一个问题,我在其他地方得到这样一个信息:
把__init__和__del__中的Person.population改成self.__class__.population
即:

class Person:
    population = 0

    def __init__(self):
        self.__class__.population += 1

    def __del__(self):
        self.__class__.population -= 1

 tom = Person()

就不会产生上述错误。

Person跟self.__class__是什么关系?他们不是一个东西么?为什么Person没有了,而self.__class__还在?



On 5/7/07, shhgs <shhgs.efhilt在gmail.com> wrote:
> Py的 __del__调用是完全不可预料的。这就是一例。
>
> 之所以会出现这个错误,是因为Py在解释完程序作清理的时候,先把
> Person类给回收了,等到它回收tom这个instance的时候才发现,Person已经变成None了,population变量自然也不知所踪了。
>
> 你可以在foo.py的最后加一句,
>
> print vars()
>
> 你会发现,如果变量名(tom, jerry)在 Person之前,则程序不会报错,如果在Person之后,则肯定报错。
>
> 总之,Py的__del__比较怪异,用的时候要特别小心。
>
> On 5/6/07, shhgs <shhgs.efhilt在gmail.com> wrote:
> > 这个问题是存在的。
> >
> > 我的机器是 ubuntu 7.04, Py版本 2.5。
> >
> > 我的感觉是 __del__。这个函数Py的Manual是不推荐你用的。大致问题出在这里。
> >
> > 等我查查文档再回信。
> >
> > On 5/6/07, Hong Yuan <hongyuan在homemaster.cn> wrote:
> > > Python2.5下运行,没有你所说的问题,也不应该出现这样的问题。更新Python版
> > > 本看看。
> > >
> > > priboy wrote:
> > > > 附件中的程序通过python foo.py执行,出现以下提示信息:
> > > >
> > > > Exception exceptions.AttributeError: "'NoneType' object has no
> > > > attribute 'population'" in > > > > <__main__.Person instance at 0x2aaaaab2ee60>> ignored
> > > >
> > > > foo.py里面的程序很简单,就是如下:
> > > >
> > > > class Person:
> > > >    population = 0
> > > >
> > > >    def __init__(self):
> > > >        Person.population += 1
> > > >
> > > >    def __del__(self):
> > > >        Person.population -= 1
> > > >
> > > > tom = Person()
> > > >
> > > > 首先我想问一下,上面提到的错误信息是什么原因造成的?
> > > >
> > > > 另外,有一个相当奇怪的现象!!我把最后那句的tom改成其他如jerry,就没有
> > > > 出现任何错误信息?!变量的命名有什么规律么?我是找不到拉,改成a没问
> > > > 题,改成p又出现问题....好奇怪啊??你们有这种情况么?
> > > > ------------------------------------------------------------------------
> > > >
> > > > class Person:
> > > >     population = 0
> > > >
> > > >     def __init__(self):
> > > >         Person.population += 1
> > > >
> > > >     def __del__(self):
> > > >         Person.population -= 1
> > > >
> > > > tom = Person()
> > > >
> > > > ------------------------------------------------------------------------
> > > >
> > > > _______________________________________________
> > > > python-chinese
> > > > Post: send python-chinese在lists.python.cn
> > > > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > > > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> > > > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> > >
> > > _______________________________________________
> > > python-chinese
> > > Post: send python-chinese在lists.python.cn
> > > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> > > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> >
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年05月07日 星期一 18:51

ygao ygao2004在gmail.com
星期一 五月 7 18:51:02 HKT 2007

有趣,可能是优化的结果?

On 5/7/07, priboy <priboy.maillist在gmail.com> wrote:
>
> 谢谢大家的解答,这个错误的产生确实是shhgs所说的那样...
>
> 另外,又有一个问题,我在其他地方得到这样一个信息:
> 把__init__和__del__中的Person.population改成self.__class__.population
> 即:
>
> class Person:
>    population = 0
>
>    def __init__(self):
>        self.__class__.population += 1
>
>    def __del__(self):
>        self.__class__.population -= 1
>
> tom = Person()
>
> 就不会产生上述错误。
>
> Person跟self.__class__是什么关系?他们不是一个东西么?为什么Person没有了,而self.__class__还在?
>
>
>
> On 5/7/07, shhgs <shhgs.efhilt在gmail.com> wrote:
> > Py的 __del__调用是完全不可预料的。这就是一例。
> >
> > 之所以会出现这个错误,是因为Py在解释完程序作清理的时候,先把
> >
> Person类给回收了,等到它回收tom这个instance的时候才发现,Person已经变成None了,population变量自然也不知所踪了。
> >
> > 你可以在foo.py的最后加一句,
> >
> > print vars()
> >
> > 你会发现,如果变量名(tom, jerry)在 Person之前,则程序不会报错,如果在Person之后,则肯定报错。
> >
> > 总之,Py的__del__比较怪异,用的时候要特别小心。
> >
> > On 5/6/07, shhgs <shhgs.efhilt在gmail.com> wrote:
> > > 这个问题是存在的。
> > >
> > > 我的机器是 ubuntu 7.04, Py版本 2.5。
> > >
> > > 我的感觉是 __del__。这个函数Py的Manual是不推荐你用的。大致问题出在这里。
> > >
> > > 等我查查文档再回信。
> > >
> > > On 5/6/07, Hong Yuan <hongyuan在homemaster.cn> wrote:
> > > > Python2.5下运行,没有你所说的问题,也不应该出现这样的问题。更新Python版
> > > > 本看看。
> > > >
> > > > priboy wrote:
> > > > > 附件中的程序通过python foo.py执行,出现以下提示信息:
> > > > >
> > > > > Exception exceptions.AttributeError: "'NoneType' object has no
> > > > > attribute 'population'" in > > > > > <__main__.Person instance at 0x2aaaaab2ee60>> ignored
> > > > >
> > > > > foo.py里面的程序很简单,就是如下:
> > > > >
> > > > > class Person:
> > > > >    population = 0
> > > > >
> > > > >    def __init__(self):
> > > > >        Person.population += 1
> > > > >
> > > > >    def __del__(self):
> > > > >        Person.population -= 1
> > > > >
> > > > > tom = Person()
> > > > >
> > > > > 首先我想问一下,上面提到的错误信息是什么原因造成的?
> > > > >
> > > > > 另外,有一个相当奇怪的现象!!我把最后那句的tom改成其他如jerry,就没有
> > > > > 出现任何错误信息?!变量的命名有什么规律么?我是找不到拉,改成a没问
> > > > > 题,改成p又出现问题....好奇怪啊??你们有这种情况么?
> > > > >
> ------------------------------------------------------------------------
> > > > >
> > > > > class Person:
> > > > >     population = 0
> > > > >
> > > > >     def __init__(self):
> > > > >         Person.population += 1
> > > > >
> > > > >     def __del__(self):
> > > > >         Person.population -= 1
> > > > >
> > > > > tom = Person()
> > > > >
> > > > >
> ------------------------------------------------------------------------
> > > > >
> > > > > _______________________________________________
> > > > > python-chinese
> > > > > Post: send python-chinese在lists.python.cn
> > > > > Subscribe: send subscribe to
> python-chinese-request在lists.python.cn
> > > > > Unsubscribe: send unsubscribe to
> python-chinese-request在lists.python.cn
> > > > > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> > > >
> > > > _______________________________________________
> > > > python-chinese
> > > > Post: send python-chinese在lists.python.cn
> > > > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > > > Unsubscribe: send unsubscribe to
> python-chinese-request在lists.python.cn
> > > > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> > >
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese在lists.python.cn
> > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese




-- 
※※※※※※※※※※※※※※※※※※※※※※※※
My blog:  http://blog.donews.com/ygao
Forum    http://groups.google.com/group/python_study
※※※※※※※※※※※※※※※※※※※※※※※※
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20070507/40d244fe/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年05月07日 星期一 19:11

vcc vcc在163.com
星期一 五月 7 19:11:30 HKT 2007

python在释放Person后把它重新赋值为None,注意这时Person变成一个变量,并不是一个对象,事实上原来Person指向的__main__.Person对象instance并没有释放,因为还有tom这个instance,应用计数还不是0;而tom的Person的instance的self.__class__由于保留了__main__.Person的地址所以依然可以访问。

对象的引用和C语言指针一样有时候是让人很头痛的;-)

----- Original Message ----- 
From: "priboy" <priboy.maillist at gmail.com>
To: <python-chinese at lists.python.cn>
Sent: Monday, May 07, 2007 4:41 PM
Subject: Re: [python-chinese] 一个莫名其妙的问题


> 谢谢大家的解答,这个错误的产生确实是shhgs所说的那样...
> 
> 另外,又有一个问题,我在其他地方得到这样一个信息:
> 把__init__和__del__中的Person.population改成self.__class__.population
> 即:
> 
> class Person:
>    population = 0
> 
>    def __init__(self):
>        self.__class__.population += 1
> 
>    def __del__(self):
>        self.__class__.population -= 1
> 
> tom = Person()
> 
> 就不会产生上述错误。
> 
> Person跟self.__class__是什么关系?他们不是一个东西么?为什么Person没有了,而self.__class__还在?
> 
> 

vcc
_

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号