最近在学习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. NC19814最短路 LCA+bfs暴力
  2. 「神策智能推荐」如何助力企业?惠头条、纵横文学、东方明珠、妈妈帮等这样说...
  3. 14.cookie与自动登陆
  4. 898A. Rounding#数的舍入
  5. 通过Spring Social发推StackExchange问​​题
  6. mysql密码命名规则_MySql命名规范
  7. 【springboot 踩坑记录】拦截器中无法注入bean
  8. 我该学习哪个人工智能系统
  9. keras版Mask-RCNN来训练自己的目标检测数据集
  10. 【深度学习-花书】第二章 线性代数
  11. 【数据预测】基于matlab斑点鬣狗算法优化BP神经网络数据预测【含Matlab 219期】
  12. 解读Depth Map Prediction from a Single Image using a Multi-Scale Deep Network (6)
  13. CTFshow wbe41 教你写脚本
  14. 大数据技术生态体系(截图)
  15. 输入卡号生成银行卡图片python_python 模拟贷个卡号生成规则过程解析
  16. 信息系统项目管理师---第四章项目整体管理历年考试题
  17. mysql recordcount 1_移植到 MySQL-对 MYSQL 数据库使用 ASP Recordcount 的问题
  18. RK3568 Android12 长按power键功能设置
  19. 蛇形填数(语言:C语言)
  20. 白嫖画师原作训练Stable Diffusion引正主不满:未经同意,说用就用?

热门文章

  1. Jedis远程链接阿里云Redis
  2. Ubuntu 肉鸡 记
  3. pip 命令突然无法使用解决办法
  4. PHP中/英文验证码
  5. 公务员笔试——侵占罪、职务侵占罪和贪污罪的区别
  6. vue+element el-menu递归多层菜单$emit事件失效
  7. 暗影精灵5风扇怎么调_惠普暗影精灵5super散热改装
  8. set -o vi
  9. 教你疾速驾驭DB2数据库中的相关饬令-3
  10. 微信小程序 版本更新