亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3685 | 回復: 6
打印 上一主題 下一主題

簡明Python教程中關于一個Person類的問題。(好像涉及Python的回收機制) [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-01-28 15:54 |只看該作者 |倒序瀏覽
今天學習看了簡明Python教程關于類的介紹,有一個Person的類的例子,我把它簡化了一下,代碼如下:
  1. class Person:
  2.     population = 0

  3.     def __init__(self, name):
  4.         self.name = name
  5.         print("Initialising a person:%s" %self.name)
  6.         Person.population += 1

  7.     def __del__(self):
  8.         print("%s is dead." %self.name)
  9.         Person.population -= 1


  10. Tom = Person("Tom")
  11. Jim = Person("Jim")
  12.         
復制代碼
在windows的cmd中執(zhí)行的時候,如果執(zhí)行的次數(shù)多了以后就會出現(xiàn)如下的錯誤:
Initialising a person:Tom
Initialising a person:Jim
Jim is dead.
Exception AttributeError: "'NoneType' object has no attribute 'population'" in <
bound method Person.__del__ of <__main__.Person object at 0x00C2B9F0>> ignored
Tom is dead.
Exception AttributeError: "'NoneType' object has no attribute 'population'" in <
bound method Person.__del__ of <__main__.Person object at 0x00B5DAD0>> ignored


在網(wǎng)上找了很多,解決方法也比較簡單,把Person.population 換成 self.__class__.population  即可,出現(xiàn)的原因是因為垃圾回收機制,
我想問一下,是什么樣的垃圾回收機制導致這種情況的出現(xiàn)??
為什么使用self.__class__.population就可以解決,他和Person.population有什么區(qū)別呢??


論壇徽章:
0
2 [報告]
發(fā)表于 2014-01-29 12:12 |只看該作者
這個問題真的很難嗎?為什么看到很多人問了,但是好像都沒有人能夠說清楚。

論壇徽章:
0
3 [報告]
發(fā)表于 2014-01-29 12:13 |只看該作者
自己來頂一下。

論壇徽章:
11
技術(shù)圖書徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
4 [報告]
發(fā)表于 2014-01-29 13:52 |只看該作者
你研究的是Python如何管理對象的生命周期,對我這個純Python使用者來說,比較難啊。自動內(nèi)存管理(垃圾回收機制),是我用Python的重要目的之一,否則還不如用C/C++。

論壇徽章:
0
5 [報告]
發(fā)表于 2014-01-29 13:57 |只看該作者
回復 4# timespace


    我也是剛開始學習的,我記得第一次按照例子來敲代碼并執(zhí)行的時候并沒有出現(xiàn)錯誤,可能正好碰到了按照正常的順序注銷,可是昨天又敲了一遍執(zhí)行的時候發(fā)現(xiàn)出現(xiàn)了問題,不知道為什么google一下發(fā)現(xiàn)很多都問過,不過沒有說的太清楚的只是說了解決的方法,用 self.__class__.population來代替。問一下,self.__class__.population和Person.population有什么區(qū)別呢?

論壇徽章:
11
技術(shù)圖書徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
6 [報告]
發(fā)表于 2014-01-29 14:59 |只看該作者
回復 5# lovekaiyuan
關于self.__class__.population和Person.population。在我看來,在對象生命周期內(nèi),這兩個用法還真沒區(qū)別。
但問題的復雜之處在于你引入了__del__,這個方法有不確定性,文檔就對這個方法做了Note和Warning,也就是說__del__調(diào)用時,其內(nèi)部引用的對象有可能已被回收。
例如,Person是class object, Jim和Tom都是class instance object,Jim或Tom的__del__調(diào)用時,你是直接引用Person這個對象,此時Person可能被回收,但self.__class__會隱式創(chuàng)建一個從class instance object指向class object閉包引用,就是說只要Jim或Tom在,Person就至少有一個引用計數(shù)而不會被回收,保證了執(zhí)行的正確性。上述推理是看官方文檔猜的,很可能是無稽之談。
參考:The Python Language Reference -> 3. Data model -> 3.3. Special method names -> 3.3.1. Basic customization & 3.3.3. Customizing class creation


   

論壇徽章:
0
7 [報告]
發(fā)表于 2014-02-01 14:50 |只看該作者
回復 6# timespace


    十分感謝,簡明python里面也說到那個東西的不確定性。我又搜了一下,網(wǎng)上也都說是不建議使用__del__的自動回收功能,我后來又試了用del Jim 和del Tom來手動釋放對象。這就沒有問題了。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP