2005年06月02日 星期四 09:57
如何初始化一个类,就像java里的 static { .... } 谢谢。
2005年06月02日 星期四 10:34
>>> class Test: a = 5 b = 3 c = a + b d = ["Hello", "world"] e = string.join(d) >>> print Test.a, Test.b, Test.c, Test.d, Test.e 5 3 8 ['Hello', 'world'] Hello world lifr wrote: >如何初始化一个类,就像java里的 > static { > .... >} > > >谢谢。 > > >------------------------------------------------------------------------ > >_______________________________________________ >python-chinese list >python-chinese at lists.python.cn >http://python.cn/mailman/listinfo/python-chinese > >
2005年06月02日 星期四 10:43
ÀàµÄ³õʼ»¯Ò»°ã·ÅÔÚ__init__(self)º¯ÊýÖУ¬È磺 class MyFrame(Frame): def __init__(self,parent=None): self.parent=parent ......... "lifr" <lifr_sh at yeah.net> дÈëÓʼþ news:02bf01c56716$81385020$590a0a0a at sh.activereasoning.com... > > ÈçºÎ³õʼ»¯Ò»¸öÀ࣬¾ÍÏñjavaÀïµÄ > static { > .... > } > > > лл¡£ > ---------------------------------------------------------------------------- ---- >
2005年06月02日 星期四 11:15
明白了。原来是如此。。。简单 这部分代码只会在import的时候执行一次,对吗? 另外一个问题,我在类的__init__函数里申请了一个文件资源, 可是我在哪里释放它呢? 谢谢。 -----Original Message----- From: python-chinese-bounces at lists.python.cn [mailto:python-chinese-bounces at lists.python.cn] On Behalf Of cpunion Sent: Thursday, June 02, 2005 10:35 AM To: python-chinese at lists.python.cn Subject: Re: [python-chinese] 如何初始化一个类(not object) >>> class Test: a = 5 b = 3 c = a + b d = ["Hello", "world"] e = string.join(d) >>> print Test.a, Test.b, Test.c, Test.d, Test.e 5 3 8 ['Hello', 'world'] Hello world lifr wrote: >如何初始化一个类,就像java里的 > static { > .... >} > > >谢谢。 > > >----------------------------------------------------------------------- >- > >_______________________________________________ >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
2005年06月02日 星期四 11:39
lifr wrote: >明白了。原来是如此。。。简单 >这部分代码只会在import的时候执行一次,对吗? > > > 每次import这个都会执行一次,如果有多处import这个,则会多次执行 >另外一个问题,我在类的__init__函数里申请了一个文件资源, >可是我在哪里释放它呢? > > 你可以在__del__里处理,不过要提到的是,__del__要么由你自己显示调用del
2005年06月02日 星期四 12:06
On 6/2/05, lifr <lifr_sh at yeah.net> wrote: > 明白了。原来是如此。。。简单 > 这部分代码只会在import的时候执行一次,对吗? 对 > > 另外一个问题,我在类的__init__函数里申请了一个文件资源, > 可是我在哪里释放它呢? file object会在销毁时(超出作用域,ref count降为0时)自动释放文件句柄。 或者手工调用其close()方法。 如果你在你自定义的类的__init__里创建的file object,*可能*你会希望在__del__方法里显式close之。 > 谢谢。 > > > > -----Original Message----- > From: python-chinese-bounces at lists.python.cn > [mailto:python-chinese-bounces at lists.python.cn] On Behalf Of cpunion > Sent: Thursday, June 02, 2005 10:35 AM > To: python-chinese at lists.python.cn > Subject: Re: [python-chinese] 如何初始化一个类(not object) > > > >>> class Test: > a = 5 > b = 3 > c = a + b > d = ["Hello", "world"] > e = string.join(d) > > >>> print Test.a, Test.b, Test.c, Test.d, Test.e > 5 3 8 ['Hello', 'world'] Hello world > > lifr wrote: > > >如何初始化一个类,就像java里的 > > static { > > .... > >} > > > > > >谢谢。 > > > > > >----------------------------------------------------------------------- > >- > > > >_______________________________________________ > >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 > > > > _______________________________________________ > python-chinese list > python-chinese at lists.python.cn > http://python.cn/mailman/listinfo/python-chinese > -- Qiangning Hong Get Firefox! <http://www.spreadfirefox.com/?q=affiliates&id=67907&t=1>
2005年06月02日 星期四 12:33
On 6/2/05, cpunion <cpunion at 263.net> wrote: > > > lifr wrote: > > >明白了。原来是如此。。。简单 > >这部分代码只会在import的时候执行一次,对吗? > > > > > > > 每次import这个都会执行一次,如果有多处import这个,则会多次执行 wrong, 无论import几次,只在第一次import时执行。 [snip] -- Qiangning Hong Get Firefox! <http://www.spreadfirefox.com/?q=affiliates&id=67907&t=1>
2005年06月02日 星期四 12:37
你可以写点测试代码验证一下 Qiangning Hong wrote: >On 6/2/05, cpunion <cpunion at 263.net> wrote: > > >>lifr wrote: >> >> >> >>>明白了。原来是如此。。。简单 >>>这部分代码只会在import的时候执行一次,对吗? >>> >>> >>> >>> >>> >>每次import这个都会执行一次,如果有多处import这个,则会多次执行 >> >> > >wrong, 无论import几次,只在第一次import时执行。 > >[snip] > > > >------------------------------------------------------------------------ > >_______________________________________________ >python-chinese list >python-chinese at lists.python.cn >http://python.cn/mailman/listinfo/python-chinese > >
2005年06月02日 星期四 12:41
确实是,我把2个测试写一块了,输出一样没看到。 Qiangning Hong wrote: >On 6/2/05, cpunion <cpunion at 263.net> wrote: > > >>lifr wrote: >> >> >> >>>明白了。原来是如此。。。简单 >>>这部分代码只会在import的时候执行一次,对吗? >>> >>> >>> >>> >>> >>每次import这个都会执行一次,如果有多处import这个,则会多次执行 >> >> > >wrong, 无论import几次,只在第一次import时执行。 > >[snip] > > > >------------------------------------------------------------------------ > >_______________________________________________ >python-chinese list >python-chinese at lists.python.cn >http://python.cn/mailman/listinfo/python-chinese > >
2005年06月02日 星期四 12:53
Qiangning Hong wrote: >On 6/2/05, lifr <lifr_sh at yeah.net> wrote: > > >>明白了。原来是如此。。。简单 >>这部分代码只会在import的时候执行一次,对吗? >> >> > >对 > > > >>另外一个问题,我在类的__init__函数里申请了一个文件资源, >>可是我在哪里释放它呢? >> >> > >file object会在销毁时(超出作用域,ref count降为0时)自动释放文件句柄。 >或者手工调用其close()方法。 > >如果你在你自定义的类的__init__里创建的file object,*可能*你会希望在__del__方法里显式close之。 > > > 光是ref count为0并不足以让其马上自动释放,释放时机由gc决定。 示例: 在IDLE中执行open("test.txt", "w+"),这个file对象引用计数为0,但并没有释 放文件句柄,用个记事本写test.txt就会告知文件正被使用。 执行gc.collect(),再用记事本写文件,这次就会成功了。 > > >>谢谢。 >> >> >> >>-----Original Message----- >>From: python-chinese-bounces at lists.python.cn >>[mailto:python-chinese-bounces at lists.python.cn] On Behalf Of cpunion >>Sent: Thursday, June 02, 2005 10:35 AM >>To: python-chinese at lists.python.cn >>Subject: Re: [python-chinese] 如何初始化一个类(not object) >> >> >> >>> class Test: >> a = 5 >> b = 3 >> c = a + b >> d = ["Hello", "world"] >> e = string.join(d) >> >> >>> print Test.a, Test.b, Test.c, Test.d, Test.e >>5 3 8 ['Hello', 'world'] Hello world >> >>lifr wrote: >> >> >> >>>如何初始化一个类,就像java里的 >>>static { >>>.... >>>} >>> >>> >>>谢谢。 >>> >>> >>>----------------------------------------------------------------------- >>>- >>> >>>_______________________________________________ >>>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 >> >> >> >>_______________________________________________ >>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 > >
2005年06月02日 星期四 13:19
There is a test: test.py class Test(object): a = 45 print a call1.py print "in call1.py, now I am to import test.py" import test call2.py print "in call2.py, now I am to imiport test.py" import test call.py print "test begin" import call1 import call2 print "test end" $ python call.py test begin in call1.py, now I am to import test.py 45 in call2.py, now I am to imiport test.py test end This shows it clearly that code fragment "a=45 print a" is only executed once no matter how many times it has been imported in a python vm. I think this is what people want it to be. thank you all. -----Original Message----- From: python-chinese-bounces at lists.python.cn [mailto:python-chinese-bounces at lists.python.cn] On Behalf Of cpunion Sent: Thursday, June 02, 2005 12:42 PM To: python-chinese at lists.python.cn Subject: Re: [python-chinese] 如何初始化一个类(not object) 确实是,我把2个测试写一块了,输出一样没看到。 Qiangning Hong wrote: >On 6/2/05, cpunion <cpunion at 263.net> wrote: > > >>lifr wrote: >> >> >> >>>明白了。原来是如此。。。简单 >>>这部分代码只会在import的时候执行一次,对吗? >>> >>> >>> >>> >>> >>每次import这个都会执行一次,如果有多处import这个,则会多次执行 >> >> > >wrong, 无论import几次,只在第一次import时执行。 > >[snip] > > > >----------------------------------------------------------------------- >- > >_______________________________________________ >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
2005年06月02日 星期四 13:29
我觉得应该有一个机制, 那就是,在一个instance的引用计数为0的时候执行用户的代码 否则,如果资源在 初始化函数 里申请的话,我不知道资源在哪里释放为好。 现在,我的办法是把资源放到全局的层次。用过程化的方法使用全局资源。而不是 由instance来管理资源。 ----------------------------- 你可以在__del__里处理,不过要提到的是,__del__要么由你自己显示调用del
2005年06月02日 星期四 14:36
On 6/2/05, cpunion <cpunion at 263.net> wrote: > > Qiangning Hong wrote: >> > >file object会在销毁时(超出作用域,ref count降为0时)自动释放文件句柄。 > >或者手工调用其close()方法。 > > > >如果你在你自定义的类的__init__里创建的file object,*可能*你会希望在__del__方法里显式close之。 > > > 光是ref count为0并不足以让其马上自动释放,释放时机由gc决定。 wrong again. 一个对象的ref count为0时是马上释放的。gc只负责那些产生循环引用的container对象,因为这些对象的ref count无法通过外部deref降为0。 > > 示例: > 在IDLE中执行open("test.txt", "w+"),这个file对象引用计数为0,但并没有释 > 放文件句柄,用个记事本写test.txt就会告知文件正被使用。 > > 执行gc.collect(),再用记事本写文件,这次就会成功了。 > 这是IDLE的问题(其实是interactive interpreter的问题),IDLE会保存最近一条语句的返回值,可使用下划线_来引用。你在IDLE中执行open("test.txt", "w+")以后,返回的file object对象的ref count为1(被IDLE环境引用着),因此记事本才会告诉你文件正被使用。执行gc.collect()之后,IDLE将改为引用collect()的返回值(0),而将file object deref,文件就被关闭了。与gc操作本身无关。 你不执行gc.collect(),随便执行什么语句都可以,只要不引起Exception,test.txt都会被关闭。 要透过现象看本质。 -- Qiangning Hong Get Firefox! <http://www.spreadfirefox.com/?q=affiliates&id=67907&t=1>
2005年06月02日 星期四 15:38
我认为还是有些出入的: >>> class Test: def __init__(self): print "init %s" % id(self) def __del__(self): print "release %s" % id(self) >>> Test() init 11533448 <__main__.Test instance at 0x00AFFC88> 这里这个对象的引用计数为0,但却没有调用__del__ >>> Test() init 16324648 release 11533448 <__main__.Test instance at 0x00F91828> 这里del的是上面一个对象,这一个也没有调用__del__ >>> a=Test() init 11500160 >>> gc.collect() release 16324648 0 在gc的帮助下调用了__del__ >>> del a release 11500160 >>> gc.collect() 0 另外,调用dir()也能促使__del__被调用。 Qiangning Hong wrote: >On 6/2/05, cpunion <cpunion at 263.net> wrote: > > >>Qiangning Hong wrote: >> >> >>>file object会在销毁时(超出作用域,ref count降为0时)自动释放文件句柄。 >>>或者手工调用其close()方法。 >>> >>>如果你在你自定义的类的__init__里创建的file object,*可能*你会希望在__del__方法里显式close之。 >>> >>> >>> >>光是ref count为0并不足以让其马上自动释放,释放时机由gc决定。 >> >> > >wrong again. >一个对象的ref count为0时是马上释放的。gc只负责那些产生循环引用的container对象,因为这些对象的ref >count无法通过外部deref降为0。 > > > >>示例: >>在IDLE中执行open("test.txt", "w+"),这个file对象引用计数为0,但并没有释 >>放文件句柄,用个记事本写test.txt就会告知文件正被使用。 >> >>执行gc.collect(),再用记事本写文件,这次就会成功了。 >> >> >> > >这是IDLE的问题(其实是interactive >interpreter的问题),IDLE会保存最近一条语句的返回值,可使用下划线_来引用。你在IDLE中执行open("test.txt", >"w+")以后,返回的file object对象的ref >count为1(被IDLE环境引用着),因此记事本才会告诉你文件正被使用。执行gc.collect()之后,IDLE将改为引用collect()的返回值(0),而将file >object deref,文件就被关闭了。与gc操作本身无关。 > >你不执行gc.collect(),随便执行什么语句都可以,只要不引起Exception,test.txt都会被关闭。 > >要透过现象看本质。 > > > >------------------------------------------------------------------------ > >_______________________________________________ >python-chinese list >python-chinese at lists.python.cn >http://python.cn/mailman/listinfo/python-chinese > >
2005年06月02日 星期四 16:06
你没有认真看我上一封信。 再解释一遍: On 6/2/05, cpunion <cpunion at 263.net> wrote: > 我认为还是有些出入的: > > >>> class Test: > def __init__(self): > print "init %s" % id(self) > def __del__(self): > print "release %s" % id(self) > > > >>> Test() > init 11533448 > <__main__.Test instance at 0x00AFFC88> > 这里这个对象的引用计数为0,但却没有调用__del__ 这里这个对象的引用计数为1,IDLE本身保存了一个对它的引用,所以不调用__del__ > >>> Test() > init 16324648 > release 11533448 > <__main__.Test instance at 0x00F91828> > 这里del的是上面一个对象,这一个也没有调用__del__ 这里IDLE解引用(deref)了上一个对象,改为引用新的对象。 上一个对象的引用计数降为0,立刻调用__del__ 新对象的引用计数为1,不调用__del__ > >>> a=Test() > init 11500160 > >>> gc.collect() > release 16324648 > 0 > 在gc的帮助下调用了__del__ 这不是在gc的帮助下调用__del__,而是IDLE解引用了上一个对象(id 16324648),改为引用新的对象(gc.collect()的返回值:整数0),从而导致上一个对象引用计数降为0,调用__del__。 > >>> del a > release 11500160 del a 导致解引用 > >>> gc.collect() > 0 > 另外,调用dir()也能促使__del__被调用。 这是因为调用dir()会导致IDLE解引用上一个对象,改为引用dir()的返回值(一个list)。 解释清楚了吗? -- Qiangning Hong Get Firefox! <http://www.spreadfirefox.com/?q=affiliates&id=67907&t=1>
2005年06月02日 星期四 16:11
我试了一下: >>> Test() init 18386336 <__main__.Test instance at 0x01188DA0> >>> 1 releae 18386336 我觉得是有一个临时的对象没有释放,随便输入一个1,立即就把上一个对象释放了。 会不会是shell本身引用了一次。 cpunion 写道: > 我认为还是有些出入的: > > >>> class Test: > def __init__(self): > print "init %s" % id(self) > def __del__(self): > print "release %s" % id(self) > > >>> Test() > init 11533448 > <__main__.Test instance at 0x00AFFC88> > 这里这个对象的引用计数为0,但却没有调用__del__ > >>> Test() > init 16324648 > release 11533448 > <__main__.Test instance at 0x00F91828> > 这里del的是上面一个对象,这一个也没有调用__del__ > >>> a=Test() > init 11500160 > >>> gc.collect() > release 16324648 > 0 > 在gc的帮助下调用了__del__ > >>> del a > release 11500160 > >>> gc.collect() > 0 > 另外,调用dir()也能促使__del__被调用。 > > > Qiangning Hong wrote: > >> On 6/2/05, cpunion <cpunion at 263.net> wrote: >> >> >>> Qiangning Hong wrote: >>> >>> >>>> file object会在销毁时(超出作用域,ref count降为0时)自动释放文件句 >>>> 柄。 >>>> 或者手工调用其close()方法。 >>>> >>>> 如果你在你自定义的类的__init__里创建的file object,*可能*你会希望在 >>>> __del__方法里显式close之。 >>>> >>>> >>> >>> 光是ref count为0并不足以让其马上自动释放,释放时机由gc决定。 >>> >> >> >> wrong again. >> 一个对象的ref count为0时是马上释放的。gc只负责那些产生循环引用的 >> container对象,因为这些对象的ref >> count无法通过外部deref降为0。 >> >> >> >>> 示例: >>> 在IDLE中执行open("test.txt", "w+"),这个file对象引用计数为0,但并没有释 >>> 放文件句柄,用个记事本写test.txt就会告知文件正被使用。 >>> >>> 执行gc.collect(),再用记事本写文件,这次就会成功了。 >>> >>> >> >> >> 这是IDLE的问题(其实是interactive >> interpreter的问题),IDLE会保存最近一条语句的返回值,可使用下划线_来 >> 引用。你在IDLE中执行open("test.txt", >> "w+")以后,返回的file object对象的ref >> count为1(被IDLE环境引用着),因此记事本才会告诉你文件正被使用。执行 >> gc.collect()之后,IDLE将改为引用collect() 的返回值(0),而将file >> object deref,文件就被关闭了。与gc操作本身无关。 >> >> 你不执行gc.collect(),随便执行什么语句都可以,只要不引起Exception, >> test.txt都会被关闭。 >> >> 要透过现象看本质。 >> >> >> >> ------------------------------------------------------------------------ >> >> _______________________________________________ >> 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 >
2005年06月02日 星期四 16:28
我已经很久没看python了,我记得python shell 有个 _(好像是,记不清了) 的变量,引用最近的结果。 2005/6/2, zhuxiaofeng <zhuxiaofeng at datangmobile.cn>: > > 我试了一下: > > >>> Test() > init 18386336 > <__main__.Test instance at 0x01188DA0> > >>> 1 > releae 18386336 > > 我觉得是有一个临时的对象没有释放,随便输入一个1,立即就把上一个对象释放了。 > 会不会是shell本身引用了一次。 > > cpunion 写道: > > > 我认为还是有些出入的: > > > > >>> class Test: > > def __init__(self): > > print "init %s" % id(self) > > def __del__(self): > > print "release %s" % id(self) > > > > >>> Test() > > init 11533448 > > <__main__.Test instance at 0x00AFFC88> > > 这里这个对象的引用计数为0,但却没有调用__del__ > > >>> Test() > > init 16324648 > > release 11533448 > > <__main__.Test instance at 0x00F91828> > > 这里del的是上面一个对象,这一个也没有调用__del__ > > >>> a=Test() > > init 11500160 > > >>> gc.collect() > > release 16324648 > > 0 > > 在gc的帮助下调用了__del__ > > >>> del a > > release 11500160 > > >>> gc.collect() > > 0 > > 另外,调用dir()也能促使__del__被调用。 > > > > > > Qiangning Hong wrote: > > > >> On 6/2/05, cpunion <cpunion at 263.net> wrote: > >> > >> > >>> Qiangning Hong wrote: > >>> > >>> > >>>> file object会在销毁时(超出作用域,ref count降为0时)自动释放文件句 > >>>> 柄。 > >>>> 或者手工调用其close()方法。 > >>>> > >>>> 如果你在你自定义的类的__init__里创建的file object,*可能*你会希望在 > >>>> __del__方法里显式close之。 > >>>> > >>>> > >>> > >>> 光是ref count为0并不足以让其马上自动释放,释放时机由gc决定。 > >>> > >> > >> > >> wrong again. > >> 一个对象的ref count为0时是马上释放的。gc只负责那些产生循环引用的 > >> container对象,因为这些对象的ref > >> count无法通过外部deref降为0。 > >> > >> > >> > >>> 示例: > >>> 在IDLE中执行open("test.txt", "w+"),这个file对象引用计数为0,但并没有释 > >>> 放文件句柄,用个记事本写test.txt就会告知文件正被使用。 > >>> > >>> 执行gc.collect(),再用记事本写文件,这次就会成功了。 > >>> > >>> > >> > >> > >> 这是IDLE的问题(其实是interactive > >> interpreter的问题),IDLE会保存最近一条语句的返回值,可使用下划线_来 > >> 引用。你在IDLE中执行open("test.txt", > >> "w+")以后,返回的file object对象的ref > >> count为1(被IDLE环境引用着),因此记事本才会告诉你文件正被使用。执行 > >> gc.collect()之后,IDLE将改为引用collect() 的返回值(0),而将file > >> object deref,文件就被关闭了。与gc操作本身无关。 > >> > >> 你不执行gc.collect(),随便执行什么语句都可以,只要不引起Exception, > >> test.txt都会被关闭。 > >> > >> 要透过现象看本质。 > >> > >> > >> > >> > ------------------------------------------------------------------------ > >> > >> _______________________________________________ > >> 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 > > > _______________________________________________ > 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/20050602/80283d4a/attachment.htm
2005年06月02日 星期四 16:35
我前面的信件里解释了,IDLE会保存最近一个表达式的值,可以通过下划线_来引用。 .>>> 3+4 7 .>>> _+8 15 On 6/2/05, zhuxiaofeng <zhuxiaofeng at datangmobile.cn> wrote: > 我试了一下: > > >>> Test() > init 18386336 > <__main__.Test instance at 0x01188DA0> > >>> 1 > releae 18386336 > > 我觉得是有一个临时的对象没有释放,随便输入一个1,立即就把上一个对象释放了。 > 会不会是shell本身引用了一次。 > > cpunion 写道: > > > 我认为还是有些出入的: > > > > >>> class Test: > > def __init__(self): > > print "init %s" % id(self) > > def __del__(self): > > print "release %s" % id(self) > > > > >>> Test() > > init 11533448 > > <__main__.Test instance at 0x00AFFC88> > > 这里这个对象的引用计数为0,但却没有调用__del__ > > >>> Test() > > init 16324648 > > release 11533448 > > <__main__.Test instance at 0x00F91828> > > 这里del的是上面一个对象,这一个也没有调用__del__ > > >>> a=Test() > > init 11500160 > > >>> gc.collect() > > release 16324648 > > 0 > > 在gc的帮助下调用了__del__ > > >>> del a > > release 11500160 > > >>> gc.collect() > > 0 > > 另外,调用dir()也能促使__del__被调用。 > > > > > > Qiangning Hong wrote: > > > >> On 6/2/05, cpunion <cpunion at 263.net> wrote: > >> > >> > >>> Qiangning Hong wrote: > >>> > >>> > >>>> file object会在销毁时(超出作用域,ref count降为0时)自动释放文件句 > >>>> 柄。 > >>>> 或者手工调用其close()方法。 > >>>> > >>>> 如果你在你自定义的类的__init__里创建的file object,*可能*你会希望在 > >>>> __del__方法里显式close之。 > >>>> > >>>> > >>> > >>> 光是ref count为0并不足以让其马上自动释放,释放时机由gc决定。 > >>> > >> > >> > >> wrong again. > >> 一个对象的ref count为0时是马上释放的。gc只负责那些产生循环引用的 > >> container对象,因为这些对象的ref > >> count无法通过外部deref降为0。 > >> > >> > >> > >>> 示例: > >>> 在IDLE中执行open("test.txt", "w+"),这个file对象引用计数为0,但并没有释 > >>> 放文件句柄,用个记事本写test.txt就会告知文件正被使用。 > >>> > >>> 执行gc.collect(),再用记事本写文件,这次就会成功了。 > >>> > >>> > >> > >> > >> 这是IDLE的问题(其实是interactive > >> interpreter的问题),IDLE会保存最近一条语句的返回值,可使用下划线_来 > >> 引用。你在IDLE中执行open("test.txt", > >> "w+")以后,返回的file object对象的ref > >> count为1(被IDLE环境引用着),因此记事本才会告诉你文件正被使用。执行 > >> gc.collect()之后,IDLE将改为引用collect() 的返回值(0),而将file > >> object deref,文件就被关闭了。与gc操作本身无关。 > >> > >> 你不执行gc.collect(),随便执行什么语句都可以,只要不引起Exception, > >> test.txt都会被关闭。 > >> > >> 要透过现象看本质。 > >> > >> > >> > >> ------------------------------------------------------------------------ > >> > >> _______________________________________________ > >> 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 > > > _______________________________________________ > python-chinese list > python-chinese at lists.python.cn > http://python.cn/mailman/listinfo/python-chinese > -- Qiangning Hong Get Firefox! <http://www.spreadfirefox.com/?q=affiliates&id=67907&t=1>
2005年06月02日 星期四 16:39
不好意思,刚才没看到下边还有一段。比较清楚了,我愿意花时间去测试,根本原 因也正是想“透过现象看本质”。 python采用引用计数为0时释放对象,没有看过这方面的资料,也没有想到会这 样。这种处理方式对效率有影响,每减少一个引用就要进行计数的判断并处理释 放,在多线程情况下,“判断、释放”这个过程要加锁,对效率影响之大简直是不敢 想象的,我想这也是我曾听过的“python线程效率不佳”的一个原因吧。另有一说是 “python中的线程不是真正的线程”,既然采用这种释放方式,为了提高效率也只好 去牺牲线程了。。。 仅仅是自己的想法,因为我以前也做过C++模拟引用计数,对性能做过测试,采用 无引用即释放,多线程下效率影响太大,采用独立的GC线程则负担很小。 Qiangning Hong wrote: >你没有认真看我上一封信。 >再解释一遍: > >On 6/2/05, cpunion <cpunion at 263.net> wrote: > > >>我认为还是有些出入的: >> >> >>> class Test: >> def __init__(self): >> print "init %s" % id(self) >> def __del__(self): >> print "release %s" % id(self) >> >> >> >>> Test() >>init 11533448 >><__main__.Test instance at 0x00AFFC88> >>这里这个对象的引用计数为0,但却没有调用__del__ >> >> > >这里这个对象的引用计数为1,IDLE本身保存了一个对它的引用,所以不调用__del__ > > > >> >>> Test() >>init 16324648 >>release 11533448 >><__main__.Test instance at 0x00F91828> >>这里del的是上面一个对象,这一个也没有调用__del__ >> >> > >这里IDLE解引用(deref)了上一个对象,改为引用新的对象。 >上一个对象的引用计数降为0,立刻调用__del__ >新对象的引用计数为1,不调用__del__ > > > >> >>> a=Test() >>init 11500160 >> >>> gc.collect() >>release 16324648 >>0 >>在gc的帮助下调用了__del__ >> >> > >这不是在gc的帮助下调用__del__,而是IDLE解引用了上一个对象(id >16324648),改为引用新的对象(gc.collect()的返回值:整数0),从而导致上一个对象引用计数降为0,调用__del__。 > > > >> >>> del a >>release 11500160 >> >> > >del a 导致解引用 > > > >> >>> gc.collect() >>0 >>另外,调用dir()也能促使__del__被调用。 >> >> > >这是因为调用dir()会导致IDLE解引用上一个对象,改为引用dir()的返回值(一个list)。 > >解释清楚了吗? > > > >------------------------------------------------------------------------ > >_______________________________________________ >python-chinese list >python-chinese at lists.python.cn >http://python.cn/mailman/listinfo/python-chinese > >
Zeuux © 2025
京ICP备05028076号