返回介绍

5.4. 类的实例化

发布于 2019-09-14 13:30:35 字数 4753 浏览 962 评论 0 收藏 0

5.4. 类的实例化

  • 5.4.1. 垃圾回收

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

例 5.7. 创建 FileInfo 实例

>>> import fileinfo
>>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") 1
>>> f.__class__                                        2
<class fileinfo.FileInfo at 010EC204>
>>> f.__doc__                                          3
'store file metadata'
>>> f                                                  4
{'name': '/music/_singles/kairo.mp3'}
1你正在创建 FileInfo 类(定义在 fileinfo 模块中)的实例,并且将新创建的实例赋值给变量 f。你传入了一个参数,/music/_singles/kairo.mp3,它将最后作为在 FileInfo 中 __init__ 方法中的 filename 参数。
2每一个类的实例有一个内置属性, __class__,它是对象的类。(注意这个表示包括了在我机器上的实例的物理地址,你的表示不会一样。) Java 程序员可能对 Class 类熟悉,这个类包含了象 getName 和 getSuperclass 之类用来得到一个对象元数据信息的方法。在 Python 中,这类元数据可以直接通过对象本身的属性,象 __class__, __name__ 和 __bases__ 来得到。
3你可以象对函数或模块一样来访问实例的 doc string。一个类的所有实例共享相同的 doc string。
4还记得什么时候 __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') 1
...     
>>> for i in range(100):
...     leakmem()                                          2
1每次 leakmem 函数被调用,你创建了 FileInfo 的一个实例,将其赋给变量 f,这个变量是函数内的一个局部变量。然后函数结束没有释放 f,所以你可能认为有内存泄漏,但是你错了。当函数结束时,局部变量 f 超出了作用域。在这个地方,不再有任何对 FileInfo 新创建实例的引用(因为除了 f 我们从未将其赋值给其它变量),所以 Python 替我们销毁掉实例。
2不管我们调用 leakmem 函数多少次,决不会泄漏内存,因为每一次,Python 将在从 leakmem 返回前销毁掉新创建的 FileInfo 类实例。

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

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

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

进一步阅读

  • Python Library Reference 总结了 象 __class__ 之类的内置属性。
  • Python Library Reference 提供了 gc 模块的文档,此模块给予你对 Python 的垃圾回收的底层控制权。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文