python对象的生命周期_(python)通过一个代码例子来分析对象的生命周期 | 学步园...
最近在学习python,看的是《简明python教程》,写的很是通俗易懂。
在一个类和对象的变量的例子中,看到代码运行结果突然想到在python中对象的生命周期的问题,代码运行结果:
#!/usr/bin/env python#coding=utf-8#filename :objvar.pyclassPerson:
population=0def__init__(self,name):
self.name=nameprint("initializing %s"%self.name)
Person.population+=1def__del__(self):print("%s say bye"%self.name)
Person.population-=1ifPerson.population==0 :print("I'm the last one")else:print("There are still %d person left"%Person.population)defSayHi(self):print("Hi,my name is %s"%self.name)defHowMany(self):ifPerson.population==1:print("I am the only Person here")else:print("We have %d person here"%Person.population)
swaroop=Person("Swaroop")#initializing Swaroopswaroop.SayHi()#Hi,my name is Swaroopswaroop.HowMany()#I am the only Person herekalam=Person("Kalam")#initializing Kalamkalam.SayHi()#Hi,my name is Kalamkalam.HowMany()#We have 2 person hereswaroop.SayHi()#Hi,my name is Swaroopswaroop.HowMany()#We have 2 person here#Kalam say bye#There are still 1 person left#Swaroop say bye#I'm the last one
最后四行注释起来的运行结果中,显示kalam对象先被释放,之后才是swaroop被释放。在教程中提到:
就如同__init__方法一样,还有一个特殊的方法__del__,它在对象消逝的时候被调用。对象消逝即对象不再被使用,它所占用的内存将返回给系统作它用。在这个方法里面,我们只是简单地把Person.population减1。
当对象不再被使用时,__del__方法运行,但是很难保证这个方法究竟在什么时候运行。如果你想要指明它的运行,你就得使用del语句,就如同我们在以前的例子中使用的那样。
就是说,代码中后面不再引用对象时,对象自动被系统回收内存。
可能1、对象的回收(析构)被调用的时间是由对象的引用位置决定的
那按他的意思,结合上面代码段输出的结果来分析因为最后两行代码swaroop,被调用使用了两个方法,所以swaroop对象才在kalam对象释放之后才被回收。
所以,我把代码修改一下。给Person增加了一个Invoke方法,这个方法什么也不做,只是为了延长对象的生命周期。代码如下:
#!/usr/bin/env python#coding=utf-8#filename :objvar.pyclassPerson:
population=0def__init__(self,name):
self.name=nameprint("initializing %s"%self.name)
Person.population+=1def__del__(self):print("%s say bye"%self.name)
Person.population-=1ifPerson.population==0 :print("I'm the last one")else:print("There are still %d person left"%Person.population)defSayHi(self):print("Hi,my name is %s"%self.name)defHowMany(self):ifPerson.population==1:print("I am the only Person here")else:print("We have %d person here"%Person.population)defInvoke(self):print("ok")
swaroop=Person("Swaroop")#initializing Swaroopswaroop.SayHi()#Hi,my name is Swaroopswaroop.HowMany()#I am the only Person herekalam=Person("Kalam")#initializing Kalamkalam.SayHi()#Hi,my name is Kalamkalam.HowMany()#We have 2 person hereswaroop.SayHi()#Hi,my name is Swaroopswaroop.HowMany()#We have 2 person herekalam.Invoke()#ok#Kalam say bye#There are still 1 person left#Swaroop say bye#I'm the last one
看完以上的代码,在这儿我就很奇怪了。为了延长对象的生命周期,我专门在代码结尾运行了"kalam.invoke()",就是欲告诉系统在最后我还要使用kalam,请不要回收。但是运行的结果却告诉我回收的动作是在运行"kalam.invoke"之后才开始的,并且回收的顺序还是先回收kalam,后回收Swaroop.
可能2、对象的释放是由对象被创建的先后顺序来决定的?
难道是有根据对象创建的先后顺序来决定回收顺序的?就是所谓的:先创建后回收,后创建先回收的原则?不行,我要试一下:
#!/usr/bin/env python#coding=utf-8#filename :objvar.pyclassPerson:
population=0def__init__(self,name):
self.name=nameprint("initializing %s"%self.name)
Person.population+=1def__del__(self):print("%s say bye"%self.name)
Person.population-=1ifPerson.population==0 :print("I'm the last one")else:print("There are still %d person left"%Person.population)defSayHi(self):print("Hi,my name is %s"%self.name)defHowMany(self):ifPerson.population==1:print("I am the only Person here")else:print("We have %d person here"%Person.population)defInvoke(self):print("ok")
kalam=Person("Kalam")#initializing Kalamkalam.SayHi()#Hi,my name is Kalamkalam.HowMany()#I am the only Person hereswaroop=Person("Swaroop")#initializing Swaroopswaroop.SayHi()#Hi,my name is Swaroopswaroop.HowMany()#We have 2 person hereswaroop.SayHi()#Hi,my name is Swaroopswaroop.HowMany()#We have 2 person herekalam.Invoke()#ok#Kalam say bye#There are still 1 person left#Swaroop say bye#I'm the last one
事实上,我再一次被它打败了。很显然,以上代码表明:虽然把swaroop和kalam对象的创建顺序进行了调整,但还是没有改变他们被释放的先后顺序。
可能3、对象的释放顺序是由对象的引用的变量决定的。
当我想到这个可能的时候也觉得挺不可思议的,但上面的代码kalam和swaroop怎么调整释放顺序也不改变,我觉得可以放手试一下。
#!/usr/bin/env python#coding=utf-8#filename :objvar.pyclassPerson:
population=0def__init__(self,name):
self.name=nameprint("initializing %s"%self.name)
Person.population+=1def__del__(self):print("%s say bye"%self.name)
Person.population-=1ifPerson.population==0 :print("I'm the last one")else:print("There are still %d person left"%Person.population)defSayHi(self):print("Hi,my name is %s"%self.name)defHowMany(self):ifPerson.population==1:print("I am the only Person here")else:print("We have %d person here"%Person.population)defInvoke(self):print("ok")
a=Person("Swaroop")#initializing Swaroopa.SayHi()#Hi,my name is Swaroopa.HowMany()#I am the only Person hereb=Person("Kalam")#initializing Kalamb.SayHi()#Hi,my name is Kalamb.HowMany()#We have 2 person hered=Person("Smithy")
d.SayHi()
d.HowMany()
c=Person("Jackson")
c.SayHi()
c.HowMany()#Swaroop say bye#There are still 3 person left#Jackson say bye#There are still 2 person left#Kalam say bye#There are still 1 person left#Smithy say bye#I'm the last one
看代码运行结果:
创建对象时顺序为:a-b-d-c(有意为之),而最终对象翻译顺序为:a-c-b-d
无药可救了。
我决定去最大的资源库---互联网上查阅一下相关的信息。
python对象的生命周期_(python)通过一个代码例子来分析对象的生命周期 | 学步园...相关推荐
- python对象的生命周期_(python)通过一个代码例子来分析对象的生命周期
最近在学习python,看的是<简明python教程>,写的很是通俗易懂. 在一个类和对象的变量的例子中,看到代码运行结果突然想到在python中对象的生命周期的问题,代码运行结果: #! ...
- python完全支持面向对象编程_[Python] 类与面向对象编程
1. class语句 类通常是由函数.变量和属性组成的集合.使用class语句可以定义类,例如: class Account(object): num_accounts = 0 def __init_ ...
- python自定义函数求差_[VBA]发布一个计算桩号之差的Excel自定义函数(VBA)
这是一个可以计算桩号之差(也就是得到长度)的Excel(或WPS)扩展函数,可以减少工程师在统计工程量时的工作量. 该函数具有一定的通用性.可以在MS Office和金山WPS上使用. 文末会给出使用 ...
- python从外部传入参数_从另一个Python脚本运行一个Python脚本,并传入参数 - python...
我想从另一个Python脚本运行一个Python脚本.我想像使用命令行一样传递变量. 例如,我将运行我的第一个脚本,该脚本将遍历值列表(0.1.2.3),并将其传递给第二个脚本,依次为script2. ...
- python operator 多属性排序_又碰到一个非常实用的模块,以后的各种运算就用它了,python内置的常用包。
在工作中,经常对数据进行各种运算,如要从一个序列中返回一个新的序列,亦或是要对两个数进行比较或者进行加和操作等.如果只是一个简单的运算,怎么都好办.但如果我们面对的是比较复杂的需求时,可能我们更多的是 ...
- 四全集学python选哪种电脑_“Python教程哪个版本最适合学习?“python教程全集
python教程,求一套比较好的python教程 好不好主要先看你自己,理解能力样,有没有接触过编程,有没础,这很重要: 看教程,能不能先给你建立起知识体系框架,许多教程一上来就直接给你灌输知识很让人 ...
- python输入文件名读取文件_[Python] python3 文件操作:从键盘输入、打开关闭文件、读取写入文件、重命名与删除文件等...
1.从键盘输入 Python 2有两个内置的函数用于从标准输入读取数据,默认情况下来自键盘.这两个函数分别是:input()和raw_input(). Python 3中,不建议使用raw_input ...
- python库的使用手册_Python 常用库之 psutil 使用指南
剧照:约定的梦幻岛(第二季) 作者:古明地盆 来源:www.cnblogs.com/traditional/p/12580638.html 楔子 Python 有一个第三方模块:psutil,专门用来 ...
- python socket能做什么_[python]初探socket
1.什么是socket? Socket中文译作:套接字,但是大家一般约定俗称的都用:socket.我想在解释socket是什么之前,先说它是用来干嘛的:socket是来建立'通信'的基础,建立连接,传 ...
最新文章
- 如何使用Github管理自己的代码
- svn教程----权限分配之示例一:开发人员拥有读写权限
- Golang中使用kafka
- 《Office 365 开发入门指南》
- 初二物理模型有哪些_暑假新初二、新初三的数学该怎么学,教辅怎么买,题该怎么刷?看这里~...
- 程序员想趁头发还在找个女友,标准:是女的就行
- laravel api_如何在现有的Laravel应用中获取即时GraphQL API
- Java高并发入门-线程初步
- 详解 | Spring Boot 最核心的 3 个注解详解
- 学习SQL 的网址集合
- commands moudle on python will replace with subprocess on py3.0
- [php] 解析JSON字符串
- 熟悉Jeecg框架、学会环境的搭建及前后端项目(OA)的启动
- miui国际版/波兰版 开通公交卡 / 模拟门禁卡
- QTableView效率优化3 - 自定义Model的内容补充
- thinkphp6 循环 视图_ThinkPHP6 视图
- 阿里巴巴罗汉堂聚6位诺贝尔奖得主研究社会问题丨科技在哪里强大,哪里便有更大的责任...
- 尚雯婕个唱化身宫廷芭比娃娃
- Hypervisor
- Unity3D 学习笔记3——了解U3D引擎的操作面板和各种工具