最近在学习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)通过一个代码例子来分析对象的生命周期 | 学步园...相关推荐

  1. python对象的生命周期_(python)通过一个代码例子来分析对象的生命周期

    最近在学习python,看的是<简明python教程>,写的很是通俗易懂. 在一个类和对象的变量的例子中,看到代码运行结果突然想到在python中对象的生命周期的问题,代码运行结果: #! ...

  2. python完全支持面向对象编程_[Python] 类与面向对象编程

    1. class语句 类通常是由函数.变量和属性组成的集合.使用class语句可以定义类,例如: class Account(object): num_accounts = 0 def __init_ ...

  3. python自定义函数求差_[VBA]发布一个计算桩号之差的Excel自定义函数(VBA)

    这是一个可以计算桩号之差(也就是得到长度)的Excel(或WPS)扩展函数,可以减少工程师在统计工程量时的工作量. 该函数具有一定的通用性.可以在MS Office和金山WPS上使用. 文末会给出使用 ...

  4. python从外部传入参数_从另一个Python脚本运行一个Python脚本,并传入参数 - python...

    我想从另一个Python脚本运行一个Python脚本.我想像使用命令行一样传递变量. 例如,我将运行我的第一个脚本,该脚本将遍历值列表(0.1.2.3),并将其传递给第二个脚本,依次为script2. ...

  5. python operator 多属性排序_又碰到一个非常实用的模块,以后的各种运算就用它了,python内置的常用包。

    在工作中,经常对数据进行各种运算,如要从一个序列中返回一个新的序列,亦或是要对两个数进行比较或者进行加和操作等.如果只是一个简单的运算,怎么都好办.但如果我们面对的是比较复杂的需求时,可能我们更多的是 ...

  6. 四全集学python选哪种电脑_“Python教程哪个版本最适合学习?“python教程全集

    python教程,求一套比较好的python教程 好不好主要先看你自己,理解能力样,有没有接触过编程,有没础,这很重要: 看教程,能不能先给你建立起知识体系框架,许多教程一上来就直接给你灌输知识很让人 ...

  7. python输入文件名读取文件_[Python] python3 文件操作:从键盘输入、打开关闭文件、读取写入文件、重命名与删除文件等...

    1.从键盘输入 Python 2有两个内置的函数用于从标准输入读取数据,默认情况下来自键盘.这两个函数分别是:input()和raw_input(). Python 3中,不建议使用raw_input ...

  8. python库的使用手册_​Python 常用库之 psutil 使用指南

    剧照:约定的梦幻岛(第二季) 作者:古明地盆 来源:www.cnblogs.com/traditional/p/12580638.html 楔子 Python 有一个第三方模块:psutil,专门用来 ...

  9. python socket能做什么_[python]初探socket

    1.什么是socket? Socket中文译作:套接字,但是大家一般约定俗称的都用:socket.我想在解释socket是什么之前,先说它是用来干嘛的:socket是来建立'通信'的基础,建立连接,传 ...

最新文章

  1. 如何使用Github管理自己的代码
  2. svn教程----权限分配之示例一:开发人员拥有读写权限
  3. Golang中使用kafka
  4. 《Office 365 开发入门指南》
  5. 初二物理模型有哪些_暑假新初二、新初三的数学该怎么学,教辅怎么买,题该怎么刷?看这里~...
  6. 程序员想趁头发还在找个女友,标准:是女的就行
  7. laravel api_如何在现有的Laravel应用中获取即时GraphQL API
  8. Java高并发入门-线程初步
  9. 详解 | Spring Boot 最核心的 3 个注解详解
  10. 学习SQL 的网址集合
  11. commands moudle on python will replace with subprocess on py3.0
  12. [php] 解析JSON字符串
  13. 熟悉Jeecg框架、学会环境的搭建及前后端项目(OA)的启动
  14. miui国际版/波兰版 开通公交卡 / 模拟门禁卡
  15. QTableView效率优化3 - 自定义Model的内容补充
  16. thinkphp6 循环 视图_ThinkPHP6 视图
  17. 阿里巴巴罗汉堂聚6位诺贝尔奖得主研究社会问题丨科技在哪里强大,哪里便有更大的责任...
  18. 尚雯婕个唱化身宫廷芭比娃娃
  19. Hypervisor
  20. Unity3D 学习笔记3——了解U3D引擎的操作面板和各种工具

热门文章

  1. Nodejs的安装随笔
  2. 彻底明白了Date(日期)Calendar(日历)GregorianCalendar(标准阳历)
  3. 芯片制造的辉煌已成过去,芯片产能过剩导致代工价格已暴跌两成
  4. Day01.HTML5
  5. 视频主观质量评价和视频客观质量评价
  6. 从零开始单排学设计模式「代理模式」青铜 III
  7. 任正非:我们国家还是要强调发展实体经济 发挥工匠精神
  8. erp服务器和文件服务器,erp是用本地服务器还是云
  9. 软考复习之第一部分计算机组成原理
  10. 2021.7.5-7.12 人工智能行业每周技术动态