5.4. 类的实例化

Python 中对类进行实例化很直接。要对类进行实例化,只要调用类 (就好像它是一个函数),传入定义在 __init__ 方法中的参数。返回值将是新创建的对象。

例 5.7. 创建 FileInfo 实例

>>> import fileinfo
>>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") 
>>> f.__class__                                        
<class fileinfo.FileInfo at 010EC204>
>>> f.__doc__                                          
'store file metadata'
>>> f                                                  
{'name': '/music/_singles/kairo.mp3'}
你正在创建 FileInfo 类 (定义在 fileinfo 模块中) 的实例,并且将新创建的实例赋值给变量 f。你传入了一个参数,/music/_singles/kairo.mp3,它将最后作为在 FileInfo__init__ 方法中的 filename 参数。
每一个类的实例有一个内置属性,__class__,它是对象的类。(注意这个表示包括了在我机器上的实例的物理地址,你的表示不会一样。)Java 程序员可能对 Class 类熟悉,时时彩计划软件公式:这个类包含了像 getNamegetSuperclass 之类用来得到一个对象元数据信息的方法。在 Python 中,这类元数据可以直接通过对象本身的属性,像 __class____name____bases__ 来得到。
你可以像对函数或模块一样来访问实例的 doc string。一个类的所有实例共享相同的 doc string
还记得什么时候 __init__ 方法将它的 filename 参数赋给 self["name"] 吗?哦,答案在这。在创建类实例时你传入的参数被正确发送到 __init__ 方法中 (当我们创建类实例时,我们所传递的参数被正确地发送给 __init__ 方法 (随同一起传递的还有对象的引用,self,它是由 Python 自动添加的)。
Python 中,创建类的实例只要调用一个类,仿佛它是一个函数就行了。不像 C++Java 有一个明确的 new 操作符。

5.4.1. 垃圾回收

如果说创建一个新的实例是容易的,那么销毁它们甚至更容易。通常,不需要明确地释放实例,因为当指派给它们的变量超出作用域时,它们会被自动地释放。内存泄漏在 Python 中很少见。

例 5.8. 尝试实现内存泄漏

>>> def leakmem():
...     f = fileinfo.FileInfo('/music/_singles/kairo.mp3') 
...     
>>> for i in range(100):
...     leakmem()                                          
每次 leakmem 函数被调用,你创建了 FileInfo 的一个实例,将其赋给变量 f,这个变量是函数内的一个局部变量。然后函数结束时没有释放 f,所以你可能认为有内存泄漏,但是你错了。当函数结束时,局部变量 f 超出了作用域。在这个地方,不再有任何对 FileInfo 新创建实例的引用 (因为除了 f 我们从未将其赋值给其它变量),所以 Python 替我们销毁掉实例。
不管我们调用 leakmem 函数多少次,决不会泄漏内存,因为每一次,Python 将在从 leakmem 返回前销毁掉新创建的 FileInfo 类实例。

对于这种垃圾收集的方式,技术上的术语叫做“引用计数”。Python 维护着对每个实例的引用列表。在上面的例子中,只有一个 FileInfo 的实例引用:局部变量 f。当函数结束时,变量 f 超出作用域,所以引用计数降为 0,则 Python 自动销毁掉实例。

Python 的以前版本中,存在引用计数失败的情况,这样 Python 不能在后面进行清除。如果你创建两个实例,它们相互引用 (例如,双重链表,每一个结点有都一个指向列表中前一个和后一个结点的指针),任一个实例都不会被自动销毁,因为 Python (正确) 认为对于每个实例都存在一个引用。Python 2.0 有一种额外的垃圾回收方式,叫做“标记后清除”,它足够聪明,可以正确地清除循环引用。

作为曾经读过哲学专业的一员,让我感到困惑的是,当没有人对事物进行观察时,它们就消失了,但是这确实是在 Python 中所发生的。通常,你可以完全忘记内存管理,让 Python 在后面进行清理。

进一步阅读

时时彩冷热号分析软件 时时彩自动excel表 老虎机注册即送体验金 时时彩包组三多少钱 内蒙古时时彩黑彩
重庆时时彩平台手机版 大龙虾时时彩手机 天天时时彩助手3.4.0 时时彩那个平台返金高 江西时时彩开奖号码查询结果
时时彩提现限制 百度重庆时时彩走势图 重庆时时彩缩水软件 时时彩开发网赚团队 重庆时时彩平台评测
重庆时时彩平刷实战 9188江西时时彩 帝豪彩票 时时彩组选120技巧 重庆时时彩销量
幸运飞艇开奖走势图 北京pk10官网视频 内蒙古11选5走势图表 辽宁快乐12实时开奖 3d349期试机号
pc蛋蛋幸运28预测 山东11选5遗漏 深圳风采13期开奖结果 圣堂txt全集下载 北京赛车pk10计划软件手机版式
印度中国边界对峙结果 体彩浙江十一选五开奖结果 棋牌斗牛如何玩 江苏快3开奖直播 云南时时彩开奖纪录
辽宁福彩35选7开奖结果 耽美小说下载网 北京赛车pk10软件微信 多乐彩11选5视频 广西11选5官网