Python论坛  - 讨论区

标题:Re: [python-chinese] 为啥会自动调用了__del__呢?

2005年08月29日 星期一 18:14

Albert Lee hanzhupeng at gmail.com
Mon Aug 29 18:14:06 HKT 2005

确实很奇怪,我把 __del__ 方法加了两行: 
   def __del__(self):
       '''I am dying.'''
       print '%s says bye.' % self.name;
       print '---'
       print dir(Person)

       Person.population -= 1;
       if Person.population == 0:
           print 'I am the last one.'
       else:
           print 'There are still %d people left.' % Person.population;

print dir(Person) 

结果,在 cmd 下独立运行,两次的结果完全不同

而在 idle 下,用 
del zhgx
del bazaari
的结果,就是正常的:

>>> 
(Initializing Bazaari)
Hello, my name is Bazaari
I am the only person here.
(Initializing zhgx)
Hello, my name is zhgx
We have 2 person here.
Hello, my name is Bazaari
zhgx says bye.
---
['HowMany', 'SayHi', '__del__', '__doc__', '__init__', '__module__',
'population']
There are still 1 people left.
Bazaari says bye.
---
['HowMany', 'SayHi', '__del__', '__doc__', '__init__', '__module__',
'population']
I am the last one.
>>> 



On 8/29/05, 广星 <guangxing at ict.ac.cn> wrote:
> 在学习Python,根据例子练习程序。
> 在类与对象的方法这一章中遇到了如下的问题,
> 困惑不已向大家请教。
> 
> 第一个问题:为什么在点击RUN的时候会报如下的提示呢?到底是不是错误》如果不是,到底是怎么回事呢?
> Exception exceptions.AttributeError: "'NoneType' object has no attribute 'population'" in <__main__.Person instance at 0x009335D0>> ignored
> 
> 第二个问题:脚本执行的结果如下,为什么会冒出来"zhgx says bye."呢?为什么在新生成对象的实例的时候自动调用了__del__呢?
> (Initializing Bazaari)
> Hello, my name is Bazaari
> I am the only person here.
> (Initializing zhgx)
> Hello, my name is zhgx
> We have 2 person here.
> Hello, my name is Bazaari
> zhgx says bye.
> There are still 1 people left.
> Bazaari says bye.
> 
> *************************************************************************************************************************
> ***************************************************源代码****************************************************************
> *************************************************************************************************************************
> #!/usr/bin/env python
> #Boa:PyApp:main
> 
> modules ={}
> 
> class Person:
>    '''Represents a person.'''
>    population = 0;
> 
>    def __init__(self, name):
>        '''Initializes the person's data.'''
>        self.name = name;
>        print '(Initializing %s)' % self.name
> 
>        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.'''
>        print 'Hello, my name is %s' % self.name;
> 
>    def HowMany(self):
>        '''Prints the current population.'''
>        if Person.population == 1:
>            print 'I am the only person here.'
>        else:
>            print 'We have %d person here.' % Person.population;
> 
> bazaari = Person('Bazaari');
> bazaari.SayHi();
> bazaari.HowMany();
> 
> zhgx = Person('zhgx');
> zhgx.SayHi();
> zhgx.HowMany();
> 
> bazaari.SayHi();
> *************************************************************************************************************************
> ***************************************************源代码****************************************************************
> *************************************************************************************************************************
> 
> 
> 广星
> guangxing at ict.ac.cn
> 2005-08-29
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
>

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

2005年08月29日 星期一 19:47

Hoxide Ma hoxide_dirac at yahoo.com.cn
Mon Aug 29 19:47:45 HKT 2005

 不奇怪,
由于GC的存在Python中__del__调用本来就在很多时候是不可预测的.
不过这个例子里面还是很明显的, 在
   zhgx = Person('zhgx');
   zhgx.SayHi();
   zhgx.HowMany();
后 zhgx 就没用了, 所以就自动清理掉了, 因此zhgx是在
bazaari前面del的.
这个顺序应该是在程序编译成字节码的时候就确定了.
Lee在IDEL里面是另一个情况, IDEL是解释器,
不当不能确定zhgx在以后是否会再用到,
所以zhgx不会自动del.

不知道解释清楚没~~,
我的建议是初学的时候不必太纠缠于这些细节.
python的好处就是不用自己做内存管理,
就用他的自动功能吧, 很舒服.


--- Albert Lee <hanzhupeng at gmail.com>写道:

> 确实很奇怪,我把 __del__ 方法加了两行: 
>    def __del__(self):
>        '''I am dying.'''
>        print '%s says bye.' % self.name;
>        print '---'
>        print dir(Person)
> 
>        Person.population -= 1;
>        if Person.population == 0:
>            print 'I am the last one.'
>        else:
>            print 'There are still %d people left.' %
> Person.population;
> 
> print dir(Person) 
> 
> 结果,在 cmd 下独立运行,两次的结果完全不同
> 
> 而在 idle 下,用 
> del zhgx
> del bazaari
> 的结果,就是正常的:
> 
> >>> 
> (Initializing Bazaari)
> Hello, my name is Bazaari
> I am the only person here.
> (Initializing zhgx)
> Hello, my name is zhgx
> We have 2 person here.
> Hello, my name is Bazaari
> zhgx says bye.
> ---
> ['HowMany', 'SayHi', '__del__', '__doc__',
> '__init__', '__module__',
> 'population']
> There are still 1 people left.
> Bazaari says bye.
> ---
> ['HowMany', 'SayHi', '__del__', '__doc__',
> '__init__', '__module__',
> 'population']
> I am the last one.
> >>> 
> 
> 
> 
> On 8/29/05, 广星 <guangxing at ict.ac.cn> wrote:
> > 在学习Python,根据例子练习程序。
> > 在类与对象的方法这一章中遇到了如下的问题,
> > 困惑不已向大家请教。
> > 
> >
>
第一个问题:为什么在点击RUN的时候会报如下的提示呢?到底是不是错误》如果不是,到底是怎么回事呢?
> > Exception exceptions.AttributeError: "'NoneType'
> object has no attribute 'population'" in > method Person.__del__ of <__main__.Person instance
> at 0x009335D0>> ignored
> > 
> >
> 第二个问题:脚本执行的结果如下,为什么会冒出来"zhgx
> says
>
bye."呢?为什么在新生成对象的实例的时候自动调用了__del__呢?
> > (Initializing Bazaari)
> > Hello, my name is Bazaari
> > I am the only person here.
> > (Initializing zhgx)
> > Hello, my name is zhgx
> > We have 2 person here.
> > Hello, my name is Bazaari
> > zhgx says bye.
> > There are still 1 people left.
> > Bazaari says bye.
> > 
> >
>
*************************************************************************************************************************
> >
>
***************************************************源代码****************************************************************
> >
>
*************************************************************************************************************************
> > #!/usr/bin/env python
> > #Boa:PyApp:main
> > 
> > modules ={}
> > 
> > class Person:
> >    '''Represents a person.'''
> >    population = 0;
> > 
> >    def __init__(self, name):
> >        '''Initializes the person's data.'''
> >        self.name = name;
> >        print '(Initializing %s)' % self.name
> > 
> >        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.'''
> >        print 'Hello, my name is %s' % self.name;
> > 
> >    def HowMany(self):
> >        '''Prints the current population.'''
> >        if Person.population == 1:
> >            print 'I am the only person here.'
> >        else:
> >            print 'We have %d person here.' %
> Person.population;
> > 
> > bazaari = Person('Bazaari');
> > bazaari.SayHi();
> > bazaari.HowMany();
> > 
> > zhgx = Person('zhgx');
> > zhgx.SayHi();
> > zhgx.HowMany();
> > 
> > bazaari.SayHi();
> >
>
*************************************************************************************************************************
> >
>
***************************************************源代码****************************************************************
> >
>
*************************************************************************************************************************
> > 
> > 
> > 广星
> > guangxing at ict.ac.cn
> > 2005-08-29
> > 
> > _______________________________________________
> > python-chinese list
> > python-chinese at lists.python.cn
> > http://python.cn/mailman/listinfo/python-chinese
> > 
> > 
> >
> > _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 


==========================================================

A student of Math in Soochow University in China.
Intrested in Math, Python, Octave, Lisp, Maxima, Prolog and .NET/MONO.

Blog: http://blog.sina.com.cn/blog/1142604745
Wiki: http://wiki.woodpecker.org.cn/moin/Hoxide


	

	
		
___________________________________________________________ 
雅虎免费G邮箱-中国第一绝无垃圾邮件骚扰超大邮箱 
http://cn.mail.yahoo.com


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

2005年08月29日 星期一 20:10

Albert Lee hanzhupeng at gmail.com
Mon Aug 29 20:10:53 HKT 2005

可问题是在独立运行时,程序会引发异常

由于idle 与独立运行环境在 GC 上的不同执行方式,以前也遇到过别的问题
我觉得这个问题应该有个更详细的探讨


On 8/29/05, Hoxide Ma <hoxide_dirac at yahoo.com.cn> wrote:
>  不奇怪,
> 由于GC的存在Python中__del__调用本来就在很多时候是不可预测的.
> 不过这个例子里面还是很明显的, 在
>   zhgx = Person('zhgx');
>   zhgx.SayHi();
>   zhgx.HowMany();
> 后 zhgx 就没用了, 所以就自动清理掉了, 因此zhgx是在
> bazaari前面del的.
> 这个顺序应该是在程序编译成字节码的时候就确定了.
> Lee在IDEL里面是另一个情况, IDEL是解释器,
> 不当不能确定zhgx在以后是否会再用到,
> 所以zhgx不会自动del.
> 
> 不知道解释清楚没~~,
> 我的建议是初学的时候不必太纠缠于这些细节.
> python的好处就是不用自己做内存管理,
> 就用他的自动功能吧, 很舒服.
>

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

2005年08月29日 星期一 20:16

Hoxide Ma hoxide_dirac at yahoo.com.cn
Mon Aug 29 20:16:06 HKT 2005

如果理解了GC还是很好确定这些情况的,
有必要写写东西做个解释啊.
不过事实上如果方法不对GC的确会出现很多问题,
而且GC和编译器优化是一对矛盾,
呵呵他们的相互作用满复杂的.

一般用pythonic的方法写程序是不会出现问题的. 

--- Albert Lee <hanzhupeng at gmail.com>写道:

> 可问题是在独立运行时,程序会引发异常
> 
> 由于idle 与独立运行环境在 GC
> 上的不同执行方式,以前也遇到过别的问题
> 我觉得这个问题应该有个更详细的探讨
> 
> 
> On 8/29/05, Hoxide Ma <hoxide_dirac at yahoo.com.cn>
> wrote:
> >  不奇怪,
> >
>
由于GC的存在Python中__del__调用本来就在很多时候是不可预测的.
> > 不过这个例子里面还是很明显的, 在
> >   zhgx = Person('zhgx');
> >   zhgx.SayHi();
> >   zhgx.HowMany();
> > 后 zhgx 就没用了, 所以就自动清理掉了, 因此zhgx是在
> > bazaari前面del的.
> > 这个顺序应该是在程序编译成字节码的时候就确定了.
> > Lee在IDEL里面是另一个情况, IDEL是解释器,
> > 不当不能确定zhgx在以后是否会再用到,
> > 所以zhgx不会自动del.
> > 
> > 不知道解释清楚没~~,
> > 我的建议是初学的时候不必太纠缠于这些细节.
> > python的好处就是不用自己做内存管理,
> > 就用他的自动功能吧, 很舒服.
> >
> > _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 


==========================================================

A student of Math in Soochow University in China.
Intrested in Math, Python, Octave, Lisp, Maxima, Prolog and .NET/MONO.

Blog: http://blog.sina.com.cn/blog/1142604745
Wiki: http://wiki.woodpecker.org.cn/moin/Hoxide


	

	
		
___________________________________________________________ 
雅虎免费G邮箱-中国第一绝无垃圾邮件骚扰超大邮箱 
http://cn.mail.yahoo.com


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

2005年08月29日 星期一 21:51

Qiangning Hong hongqn at gmail.com
Mon Aug 29 21:51:03 HKT 2005

Albert Lee wrote:
> 可问题是在独立运行时,程序会引发异常
> 
> 由于idle 与独立运行环境在 GC 上的不同执行方式,以前也遇到过别的问题
> 我觉得这个问题应该有个更详细的探讨

__del__何时会调用以及IDLE(其实是交互解释环境)下的异常表现以前讨论过,
请参见邮件列表存档:

http://thread.gmane.org/gmane.comp.python.chinese/10751

-- 
Qiangning Hong

I'm usually annoyed by IDEs because, for instance, they don't use VIM
as an editor. Since I'm hooked to that, all IDEs I've used so far have
failed to impress me.
    -- Sybren Stuvel @ c.l.python

Get Firefox!
<http://www.spreadfirefox.com/?q=affiliates&id=67907&t=1>

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

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

    你的回复:

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

    Zeuux © 2025

    京ICP备05028076号