Python论坛  - 讨论区

标题:[python-chinese] 如何初始化一个类(not object)

2005年06月02日 星期四 09:57

lifr lifr_sh at yeah.net
Thu Jun 2 09:57:59 HKT 2005

如何初始化一个类,就像java里的
 static {
 ....
}


谢谢。

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

2005年06月02日 星期四 10:34

cpunion cpunion at 263.net
Thu Jun 2 10:34:50 HKT 2005

 >>> 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
>  
>

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

2005年06月02日 星期四 10:43

ÒÊÃÉɽÈË dreamingpython at 163.com
Thu Jun 2 10:43:46 HKT 2005

ÀàµÄ³õʼ»¯Ò»°ã·ÅÔÚ__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 {
>  ....
> }
>
>
> лл¡£
>


----------------------------------------------------------------------------
----


>




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

2005年06月02日 星期四 11:15

lifr lifr_sh at yeah.net
Thu Jun 2 11:15:28 HKT 2005

明白了。原来是如此。。。简单
这部分代码只会在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




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

2005年06月02日 星期四 11:39

cpunion cpunion at 263.net
Thu Jun 2 11:39:35 HKT 2005


lifr wrote:

>明白了。原来是如此。。。简单
>这部分代码只会在import的时候执行一次,对吗?
>
>  
>
每次import这个都会执行一次,如果有多处import这个,则会多次执行

>另外一个问题,我在类的__init__函数里申请了一个文件资源,
>可是我在哪里释放它呢?
>  
>
你可以在__del__里处理,不过要提到的是,__del__要么由你自己显示调用del 
来执行,要么由gc来执行。如果由gc执行,无法保证能及时释放文件资 
源,调用gc.collect()可以马上执行垃圾回收程序,不过频繁调用会影响性能。

__del__并不是C++析构函数的等价物,不过你熟悉java,它和java中*finalize函 
数相似,gc.collect ()和System.gc()功能相近。*

>谢谢。
>
>
>
>-----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
>
>
>  
>

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

2005年06月02日 星期四 12:06

Qiangning Hong hongqn at gmail.com
Thu Jun 2 12:06:11 HKT 2005

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>

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

2005年06月02日 星期四 12:33

Qiangning Hong hongqn at gmail.com
Thu Jun 2 12:33:11 HKT 2005

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>

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

2005年06月02日 星期四 12:37

cpunion cpunion at 263.net
Thu Jun 2 12:37:31 HKT 2005

你可以写点测试代码验证一下

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
>  
>

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

2005年06月02日 星期四 12:41

cpunion cpunion at 263.net
Thu Jun 2 12:41:46 HKT 2005

确实是,我把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
>  
>

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

2005年06月02日 星期四 12:53

cpunion cpunion at 263.net
Thu Jun 2 12:53:22 HKT 2005


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
>  
>

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

2005年06月02日 星期四 13:19

lifr lifr_sh at yeah.net
Thu Jun 2 13:19:06 HKT 2005

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




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

2005年06月02日 星期四 13:29

lifr lifr_sh at yeah.net
Thu Jun 2 13:29:26 HKT 2005

我觉得应该有一个机制, 
那就是,在一个instance的引用计数为0的时候执行用户的代码
否则,如果资源在 初始化函数 里申请的话,我不知道资源在哪里释放为好。

现在,我的办法是把资源放到全局的层次。用过程化的方法使用全局资源。而不是
由instance来管理资源。

-----------------------------

你可以在__del__里处理,不过要提到的是,__del__要么由你自己显示调用del 
来执行,要么由gc来执行。如果由gc执行,无法保证能及时释放文件资 
源,调用gc.collect()可以马上执行垃圾回收程序,不过频繁调用会影响性能。

__del__并不是C++析构函数的等价物,不过你熟悉java,它和java中*finalize函 
数相似,gc.collect ()和System.gc()功能相近。*

>谢谢。
>
>
>
>-----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


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

2005年06月02日 星期四 14:36

Qiangning Hong hongqn at gmail.com
Thu Jun 2 14:36:30 HKT 2005

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>

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

2005年06月02日 星期四 15:38

cpunion cpunion at 263.net
Thu Jun 2 15:38:29 HKT 2005

我认为还是有些出入的:

 >>> 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
>  
>

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

2005年06月02日 星期四 16:06

Qiangning Hong hongqn at gmail.com
Thu Jun 2 16:06:44 HKT 2005

你没有认真看我上一封信。
再解释一遍:

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>

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

2005年06月02日 星期四 16:11

zhuxiaofeng zhuxiaofeng at datangmobile.cn
Thu Jun 2 16:11:16 HKT 2005

我试了一下:

 >>> 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
>

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

2005年06月02日 星期四 16:28

noright noright0 at gmail.com
Thu Jun 2 16:28:37 HKT 2005

我已经很久没看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

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

2005年06月02日 星期四 16:35

Qiangning Hong hongqn at gmail.com
Thu Jun 2 16:35:41 HKT 2005

我前面的信件里解释了,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>

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

2005年06月02日 星期四 16:39

cpunion cpunion at 263.net
Thu Jun 2 16:39:26 HKT 2005

不好意思,刚才没看到下边还有一段。比较清楚了,我愿意花时间去测试,根本原 
因也正是想“透过现象看本质”。

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
>  
>

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

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

    你的回复:

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

    Zeuux © 2025

    京ICP备05028076号