2005年08月29日 星期一 20:12
不奇怪, 由于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邮箱-No.1的防毒防垃圾超大邮箱 http://cn.mail.yahoo.com
2005年08月29日 星期一 22:37
多谢解释,现在明白啦! > 不奇怪, >由于GC的存在Python中__del__调用本来就在很多时候是不可预测的. >不过这个例子里面还是很明显的, 在 > zhgx = Person('zhgx'); > zhgx.SayHi(); > zhgx.HowMany(); >后 zhgx 就没用了, 所以就自动清理掉了, 因此zhgx是在 >bazaari前面del的. >这个顺序应该是在程序编译成字节码的时候就确定了. >Lee在IDEL里面是另一个情况, IDEL是解释器, >不当不能确定zhgx在以后是否会再用到, >所以zhgx不会自动del. 可是要是我在后面还会用到zhgx怎么办呢? 系统自动把他删除了,岂不是会造成内存访问错误? > >不知道解释清楚没~~, >我的建议是初学的时候不必太纠缠于这些细节. >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 > >_______________________________________________ >python-chinese list >python-chinese at lists.python.cn >http://python.cn/mailman/listinfo/python-chinese > = = = = = = = = = = = = = = = = = = = = 致 礼! guangxing guangxing at ict.ac.cn 2005-08-29
2005年08月30日 星期二 09:17
之前我看了一些关于Python具有强大的自省能力的文章,对Python的自省能力有了一定的了解,现在我想编写这样一个函数,把类对象的所有数据成员的“<名称,值>”打印出来,由于时间比较紧迫,我自己对Python这方面的了解还不多,请大虾们能够指点指点,谢谢! -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050830/77abadbe/attachment.htm
2005年08月30日 星期二 09:28
在 05-8-30,xu.shengyong<zjxushengyong at hotmail.com> 写道: > > 之前我看了一些关于Python具有强大的自省能力的文章,对Python的自省能力有了一定的了解,现在我想编写这样一个函数,把类对象的所有数据成员的"<名称,值>"打印出来,由于时间比较紧迫,我自己对Python这方面的了解还不多,请大虾们能够指点指点,谢谢! a.__dict__就是。 -- I like python! My Donews Blog: http://www.donews.net/limodou
2005年08月30日 星期二 10:51
谢谢limodou大虾,:),刚才我用你介绍的方法可以把一个任意类型对象的所有数据成员的"<名称,值>"对打印出来,但是如果我还想知道数据成员的类型,即打印的是"<名称,类型,值>",是否能够实现这种功能?谢谢! >>> class Var: ... pass ... >>> var = Var() >>> var.name = "esuncn" >>> var.type = "str" >>> var.mx = 123 >>> var.__dict__ {'type': 'str', 'name': 'esuncn', 'mx': 123} ----- Original Message ----- From: "limodou" <limodou at gmail.com> To: <python-chinese at lists.python.cn> Sent: Tuesday, August 30, 2005 9:28 AM Subject: Re: [python-chinese] 请教:关于Python的“自省”能力??? >在 05-8-30,xu.shengyong<zjxushengyong at hotmail.com> 写道: >> >> 之前我看了一些关于Python具有强大的自省能力的文章,对Python的自省能力有了一定的了解,现在我想编写这样一个函数,把类对象的所有数据成员的"<名称,值>"打印出来,由于时间比较紧迫,我自己对Python这方面的了解还不多,请大虾们能够指点指点,谢谢! > > a.__dict__就是。 > > > -- > I like python! > My Donews Blog: http://www.donews.net/limodou > -------------------------------------------------------------------------------- > _______________________________________________ > python-chinese list > python-chinese at lists.python.cn > http://python.cn/mailman/listinfo/python-chinese >
2005年08月30日 星期二 10:53
dir , type , dis.dis On 8/30/05, xu.shengyong <zjxushengyong at hotmail.com> wrote: > > > 谢谢limodou大虾,:),刚才我用你介绍的方法可以把一个任意类型对象的所有数据成员的"<名称,值>"对打印出来,但是如果我还想知道数据成员的类型,即打印的是"<名称,类型,值>",是否能够实现这种功能?谢谢! > > >>> class Var: > ... pass > ... > >>> var = Var() > >>> var.name <http://var.name> = "esuncn" > >>> var.type = "str" > >>> var.mx <http://var.mx> = 123 > >>> var.__dict__ > {'type': 'str', 'name': 'esuncn', 'mx': 123} > > > > ----- Original Message ----- > From: "limodou" <limodou at gmail.com> > To: <python-chinese at lists.python.cn> > Sent: Tuesday, August 30, 2005 9:28 AM > Subject: Re: [python-chinese] 请教:关于Python的"自省"能力??? > > > >在 05-8-30,xu.shengyong<zjxushengyong at hotmail.com> 写道: > >> > >> > 之前我看了一些关于Python具有强大的自省能力的文章,对Python的自省能力有了一定的了解,现在我想编写这样一个函数,把类对象的所有数据成员的"<名称,值>"打印出来,由于时间比较紧迫,我自己对Python这方面的了解还不多,请大虾们能够指点指点,谢谢! > > > > a.__dict__就是。 > > > > > > -- > > I like python! > > My Donews Blog: http://www.donews.net/limodou > > > > > > -------------------------------------------------------------------------------- > > > > _______________________________________________ > > 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 > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050830/707f3a90/attachment.htm
2005年08月30日 星期二 11:13
在 05-8-30,xu.shengyong<zjxushengyong at hotmail.com> 写道: > 谢谢limodou大虾,:),刚才我用你介绍的方法可以把一个任意类型对象的所有数据成员的"<名称,值>"对打印出来,但是如果我还想知道数据成员的类型,即打印的是"<名称,类型,值>",是否能够实现这种功能?谢谢! 使用type(obj)即可。 -- I like python! My Donews Blog: http://www.donews.net/limodou
Zeuux © 2025
京ICP备05028076号